stm32中大小端转换
一、在进行网络通信时是否需要进行字节序转换?
相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换。
原因如下:网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节。小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接收方网络协议函数接收时会将接收到的第一个字节存放到低地址(想要接收高字节,真正接收的是低字节),所以最后双方都正确的收发了数据。
而相同平台进行通信时,如果双方都进行转换最后虽然能够正确收发数据,但是所做的转换是没有意义的,造成资源的浪费。而不同平台进行通信时必须进行转换,不转换会造成错误的收发数据,字节序转换函数会根据当前平台的存储模式做出相应正确的转换,如果当前平台是大端,则直接返回不进行转换,如果当前平台是小端,会将接收到得网络字节序进行转换。
举例:整形值10000,对应十六进制表示为0x2710,按照字节可分为0x27(高位)和0x10(低位)
小端字节序:第一个内存单元就是低地址,存放低位:0x10(低字节),接下来的内存单元是高地址,存放高位:0x27 (高字节) --->0x1027
小端模式下,在内存中的存在形式
大端字节序:第一个内存单元就是低地址,存放高位:0x27(高字节),接下来的内存单元是低地址,存放低位:0x10(低字节) --->0x2710
大端模式下,在内存中的存在形式
stm32测试程序:小端模式
u16 eth_type_be;
char *p;
eth_type_be = 0xffee
printf("eth_type_be = %4x\r\n",eth_type_be);
p = (char *)ð_type_be;
printf("低地址p = %p\t 存储的数据是 %x\r\n",p,(int)*p);
printf("高地址p = %p\t 存储的数据是 %x\r\n",p+1,(int)*(p+1));
测试结果
对于小端模式来说,上面我们也说了,而被发送方网络协议函数发送时会首先去低地址取数据,对于上面0x2710来说,我们应该发送高字节0x27,后发送0x10才对,可是我们发现0x10存在于内存的地址中,不是高字节,显然是错误的。所以对于小端模式来说,我们先进行一次大小端转换,把0x2710转换成0x1027,此时内存中低地址存放的是0x27,是高字节,可以正确发送了。