最近一段时间在编写上位机与ARM通信程序是,发现几个比较奇怪的现象:
1、结构体对齐,详见:网络套接字发送结构体及数据处理
2、结构体数据发送反转问题,这个将在下面具体介绍:
首先,代码如下:
struct Info{
byte len;
unsigned int value;
byte data;
};
struct Info *data_info;
data_info = (Info *)malloc(1*sizeof(Info));
data_info.len = 0x12;
data_info.value = 0x11223344;
data_info.data = 0x10;
m_socket.send((void *)data_info,sizeof(data_info),m_send_port,m_send_ipaddress,0);
结果,接收到的数据是:12 44 33 22 11 10,当是知道是数据反转,但是不明白原因,最后到网上查了下,然后结合自己所学的ARM知识,最终分析明白了为什么。
首先,我们知道x86使用的处理器是小端格式,所谓小端格式指高字节存放高地址,低字节存放低地址:
地址 | 0x00 | 0x01 | 0x02 | 0x03 |
数据 | 44 | 33 | 22 | 11 |
那么,在网卡搬移数据时,是按字节为单位,进行数据的搬移。因此肯定会将44先取出,最后取33,这意味着在网卡芯片的RAM中,每1字节的数据将出现反转,那么接收的时候,就出现了数据的反转问题。