細細碎碎的知識點還真是不少啊,今天總結下通信中的數據字節序的問題。
先來認識名詞:
MSB:Most Significant Bit. “最高有效位”
LSB:Least Significant Bit. “最低有效位”
大端模式:Big Endian.
小端模式:Little Endian.
關於MSB和LSB的東西很簡單,MSB指一個數據的二進制表示的最高有效位,LSB指數據的最低有效位,舉個栗子看:
1(MSB)001 1011(LSB)
看到了吧,有點類似於十進制,如:13265(一萬三千二百六十五),其中萬位的1就是MSB,個位的5就是LSB。
好了,這個就這樣了。下面是大小端的區別。
大端模式:一個多字節數據的高字節在前,低字節在后,以數據 0x1234ABCD 看例子:
低地址 ---------------------> 高地址
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
| 12 | 34 | AB | CD |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
小端模式:一個多字節數據的低字節在前,高字節在后,仍以 0x1234ABCD 看:
低地址 ---------------------> 高地址
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
| CD | AB | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
以上的例子應該比較形象了吧,大家可能會感覺大端模式比較符合人類的習慣啊,存儲的順序和直觀理解的順序是一樣的。X86架構的CPU好想都是小端模式的....
在項目編程中,我個人接觸的都是小端模式,在傳輸數據的時候,組幀時都是把低字節數據放在數組的前邊的,所以,不要太仇視小端模式。
協議中如果寫 “LSB first” ,這就是指數據傳輸時采用小端模式,所以,組幀不要錯了哦。
再附加一下怎么判斷自己的PC是大端模式還是小端模式,看代碼:
1 #include <stdio.h> 2 int main() 3 { 4 typedef union{ 5 int a; 6 char b; 7 }UN_TEST; /* 定義一個聯合體數據類型 */ 8 9 UN_TEST d; 10 d.a = 1; 11 if(d.b == 1) 12 { 13 printf("Little Endian\n"); 14 } 15 else 16 { 17 printf("Big Endian\n"); 18 } 19 20 return 0; 21 }
聯合體的數據元素共用內存,所以你給int元素賦個1,如果是小端模式,它的存儲就是 “ 01 00 00 00 ” 這樣的;如果是大端模式,就是 “ 00 00 00 01 ” 這樣的,所以通過判斷char元素的值(共用內存,所以這個值占用的是第一個字節的地址)就可以得到了。