stm32中大小端转换

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

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

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

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

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

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

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

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

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

扫描二维码关注公众号,回复: 8870964 查看本文章

stm32测试程序:小端模式

u16 eth_type_be;
    char *p;
    eth_type_be = 0xffee
    printf("eth_type_be = %4x\r\n",eth_type_be);
    p = (char *)&eth_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,是高字节,可以正确发送了。

发布了6 篇原创文章 · 获赞 1 · 访问量 144

猜你喜欢

转载自blog.csdn.net/qq_42570756/article/details/103745032