c语言主机字节序和网络字节序

c语言主机字节序和网络字节序一 什么是字节序字节序是指多字节数据在计算机内存中存储顺序 或者网络传输时各字节的传输顺序 字节序分为大端序和小端序 大端序 高字节存储在低位地址 传输数据时高位在前 小端序 高字节存储在高位地址 传输数据时高位在后 假设 0x4001 0x4004 地址中存储有一个整型变量 0x 它在大端和小端 mcu 中的存储方式如下 地址大端存储小端存储 0x40040x780x

一、什么是字节序

字节序是指多字节数据在计算机内存中存储顺序,或者网络传输时各字节的传输顺序,字节序分为大端序和小端序。

  • 大端序:高字节存储在低位地址,传输数据时高位在前;
  • 小端序:低字节存储在低位地址,传输数据时高位在后;

假设0x4001-0x4004地址中存储有一个整型变量0x,它在大端和小端mcu中的存储方式如下:

地址 大端存储 小端存储
0x4004 0x78 0x12
0x4003 0x56 0x34
0x4002 0x34 0x56
0x4001 0x12 0x78

地址0x4001是低位地址,0x12是数据的高位,高位数据0x12放在低位地址,则是大端序,反之则是小端序。

前面讲的都是多字节数据在计算机中存储的方式,我们在进行数据通讯的时候通常也会约定字节序。在数据通讯中,数据的高位先传输,则为大端序,数据的低位先传输,则为小端序。比如0x这四个字节的数据,如果依次传输0x12、0x34、0x56、0x78则为大端序。

二、如何判断字节序

字节序的判断只需要一段简单的代码即可:

int main() { int x=0x; unsigned char *p=(char *)&x; printf("%p %p %p %p\r\n",p,p+1,p+2,p+3); printf("%0x %0x %0x %0x\r\n",p[0],p[1],p[2],p[3]); } 
lscpu | grep -i byte 

lscpu表示查看cup的相关信息,grep -i byte表示过滤字节序字段。

三、网络字节序

TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,所以网络字节序是大端序; 我们的电脑和一些常用的处理器芯片大都是小端序的存储方式,在发送数据之前需要进行字节序的转换。

假设我们需要把0x通过udp发送出去,我们在linux上写如下代码:




int buffer = 0x; ret = sendto(sockfd,&buffer,sizeof(int),0,&dest_addr,sizeof(dest_addr)); 

我们可以使用htonl将主机字节序转换成网络字节序:

int buffer = 0x; buffer = htonl(buffer); ret = sendto(sockfd,&buffer,sizeof(int),0,&dest_addr,sizeof(dest_addr)); 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208357.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:46
下一篇 2026年3月19日 上午11:46


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号