字節序相關問題簡單總結,LSB與MSB


細細碎碎的知識點還真是不少啊,今天總結下通信中的數據字節序的問題。

先來認識名詞:

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元素的值(共用內存,所以這個值占用的是第一個字節的地址)就可以得到了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM