细细碎碎的知识点还真是不少啊,今天总结下通信中的数据字节序的问题。

先来认识名词:

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

posted on 2016-09-17 21:48  一世流离  阅读(12301)  评论(2编辑  收藏  举报