详解大端模式和小端模式
以太网通讯、MODBUS通讯、软件移植性方面。这里,举一个MODBUS通讯的例子。在MODBUS中,数据需要组织成数据报文,该报文中的数据都是大端模式,即低地址存高位,高地址存低位。假设有一16位缓冲区m_RegMW[256],因为是在x86平台上,所以内存中的数据为小端模式:m_RegMW[0].low、m_RegMW[0].high、m_RegMW[1].low、m_RegMW[1].high……
为了方便讨论,假设m_RegMW[0] = 0x3456; 在内存中为0x56、0x34。
现要将该数据发出,如果不进行数据转换直接发送,此时发送的数据为0x56,0x34。而Modbus是大端的,会将该数据解释为0x5634而非原数据0x3456,此时就会发生灾难性的错误。所以,在此之前,需要将小端数据转换成大端的,即进行高字节和低字节的交换,此时可以调用步骤五中的函数BigtoLittle16(m_RegMW[0]),之后再进行发送才可以得到正确的数据。
附面试题一道:(详见:http://tieba.baidu.com/p/3145609121)
unsigned long res=0;
unsigned long array ={0x01020304,0x05060708};
char *p= (char *)&array[0];
p+=2;
res = (unsigned long )*p; //原题此处错了,否则结果是2,应该这样写 res=*( (unsigned long)p )
res=?求最后res的值是多少。运行环境是win32
解析:我们常用的X86结构是小端模式,而KEILC51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。大小端的最低单位是字节。
图画的不知道对不对,如果错误请指正,谢谢~~
小端CPU下(低位地址存低位数据):
请注意这里:res = (unsigned long )*p;
那么现在res的内存从低到高情况: 02 01 08 07
因为是小端CPU模式,还需要将内存存储状况转换回来,即:res=0x07080102
大端CPU模式(低位地址存高位数据):
res的内存情况: 03 04 05 06
大端模式下,无需转换,即:res=0x03040506
下面有这么一个验证:
大端模式小端模 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)