时隔一个月又回到了博客园写文章,很开心O(∩_∩)O~~
今天在做需求的涉及到一个固件版本的概念,其中固件组的人谈到了版本号从MSB
到LSB
排列,检索查阅后将所得整理如下。
MSB、LSB?
MSB(Most Significant Bit):最高有效位,二进制中代表最高值的比特位,这一位对数值的影响最大。
LSB(Least Significant Bit):最低有效位,二进制中代表最低值的比特位
例如,在二进制的1001(十进制的9)中,最左边的“1”即是MSB对数值影响最大,从1到9的变化幅度。而最右边的1是LSB因为仅会让数值产生8到9的变化。
总结:MSB指二进制中表示的最高有效位,LSB指数据的最低有效位,1(MSB)001(LSB)
大小端模式?
大端模式(Big-Endian):数据的高位字节放到内存的低地址端,低位字节放到内存的高地址端。
小端模式(Little-Endian):数据的低位字节放到内存的低地址端,高位字节放到内存的高地址端。
内存地址:它只是一个编号而已,代表一个内存空间。那么这个空间是多大呢?原来在计算机中存储器的容量是以字节为基本单位的。也就是说一个内存地址代表一个字节(8bit)的存储空间。
把数据放到内存中先放到低位地址编号在用高位地址编号。
如 0x0000-->0x0001-->0x0002-->0x0003
示例:假如现在有一个32位int型数0x12345678。
上面讲到存储器已字节(8bit)为基本单位,那么32位的数在内存中就对应32/8=4,需要4个内存地址表示的内存空间去存储这个数据。
这个数的MSB为0x12,
这个数的LSB 为0x78
OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。
地址偏移 |
大端模式 |
小端模式 |
0x00 |
12(OP0) |
78(OP3) |
0x01 |
34(OP1) |
56(OP2) |
0x02 |
56(OP2) |
34(OP1) |
0x03 |
78(OP3) |
12(OP0) |
数据按照大端模式及小端模式在内存中存储的示意图如下
区别:
采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将高位存放在高地址。
采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。
有的处理器系统采用了小端方式进行数据存放,如intel芯片是小端(修改分区表时要注意)。
有的处理器系统采用了大端方式进行数据存放,如IBM半导体和Freescale的PowerPC处理器以及一些常见的单片机芯片。不仅对于处理器,一些外设的设计中也存在着使用大端或者小端进行数据存放的选择。
特别的intel x86的CPU使用的是LE(Windows中称为“主机字节序”),而SocksAddr中使用的则是BE(就是“网络字节序”),所以在使用网络编程时需要使用htns,htnl,nths,nthl来倒字节序。
网络字节序问题?
网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。
网络字节顺序采用big endian(大端)排序方式。
TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字节是高位字节;
而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节,即多字节数值在发送之前,在内存中因该是以大端法存放的。
网络字节序是确定的,明确以大端方式进行排序。但是,主机字节序有可能是按照大端存放(大端<--->大端,无需转换),也有可能按照小端存放(大端<--->小端,用特定函数进行转换)
参考文章: