大小端模式:
- 大端模式(big endian)和小端模式(little endian)。
- 串口通信时,一次只能发送一个字节,这时候就有一个问题,是从0-1还是从1-0.规则就是发送方和接受方必须按照相同的顺序来通信,否则就会出现错误。这就是通信当中的大小端模式。
- 我们讲的实质计算机存储系统中的大小端。在计算机内存/硬盘/iNand中,因为存储系统是32位的,但数据仍然是按照字节为单位的。于是一个32位的二进制在内存中存储是由2种分布方式:高字节对应高地址(大端模式)、高字节对用低地址(小端模式)。
- 大小端模式本身没有好坏,理论上都可以。但存储时必须按照同样的模式来进行存储,否则会出错。(大部分是小端)
- 我们写代码不知道当前模式时,就需要用代码检测当前环境时大端模式还是小端模式。
- 利用union测试
- 利用指针来测试
不可行的测试大小端方式:位与、移位、强制类型转化
-
位与运算无法测试大小端模式。(大端机器和小端机器的&运算后的值是相同的)
- 位与运算时编译器提供的运算,这个运算是高于内存层次的(或者说&运算在二进制层次具有可移植性,也就是&的时候时候一定是高字节&高字节,低字节&低字节)
-
移位也不能测试机器大小端
- 原因和&运算符不能测试一样,C语言对运算符的级别是高于二进制层次的。右移运算永远四讲低字节移除,而和二进制存储时这个低字节的高位还是低位无关。
-
强制类型转化
- 理由同上
- 在通信协议中,大小端是非常重要的,使用别人定义的通信协议或自己定义协议,一定要注明大小端