時隔一個月又回到了博客園寫文章,很開心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協議規定:把接收到的第一個字節當作高位字節看待,這就要求發送端發送的第一個字節是高位字節;
而在發送端發送數據時,發送的第一個字節是該數值在內存中的起始地址處對應的那個字節,也就是說,該數值在內存中的起始地址處對應的那個字節就是要發送的第一個高位字節,即多字節數值在發送之前,在內存中因該是以大端法存放的。
網絡字節序是確定的,明確以大端方式進行排序。但是,主機字節序有可能是按照大端存放(大端<--->大端,無需轉換),也有可能按照小端存放(大端<--->小端,用特定函數進行轉換)
參考文章:
