stm32中大小端转换

一、在进行网络通信时是否需要进行字节序转换? 

       相同字节序的平台(你是大端平台)在进行网络通信时可以不进行字节序转换,但是跨平台(你是小端平台)进行网络数据通信时必须进行字节序转换。

二、网络协议的规定 

网络协议规定接收到得第一个字节是高字节,存放到低地址,所以发送时会首先去低地址取数据的高字节。小端模式的多字节数据在存放时,低地址存放的是低字节,而被发送方网络协议函数发送时会首先去低地址取数据(想要取高字节,真正取得是低字节),接收方网络协议函数接收时会将接收到的第一个字节存放到低地址(想要接收高字节,真正接收的是低字节),所以最后双方都正确的收发了数据。

而相同平台进行通信时,如果双方都进行转换最后虽然能够正确收发数据,但是所做的转换是没有意义的,造成资源的浪费。而不同平台进行通信时必须进行转换,不转换会造成错误的收发数据,字节序转换函数会根据当前平台的存储模式做出相应正确的转换,如果当前平台是大端,则直接返回不进行转换,如果当前平台是小端,会将接收到得网络字节序进行转换

三、举个栗子 

举例:整形值10000,对应十六进制表示为0x2710,按照字节可分为0x27(高位)和0x10(低位)

小端字节序:第一个内存单元就是低地址,存放低位:0x10(低字节),接下来的内存单元是高地址,存放高位:0x27 (高字节)  --->0x1027

小端模式下,在内存中的存在形式

stm32中大小端转换_第1张图片

大端字节序:第一个内存单元就是低地址,存放高位:0x27(高字节),接下来的内存单元是低地址,存放低位:0x10(低字节) --->0x2710

大端模式下,在内存中的存在形式

stm32中大小端转换_第2张图片

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,是高字节,可以正确发送了。

你可能感兴趣的:(STM32)