socket网络字节序以及大端序小端序

本文介绍了计算机中的大端序和小端序概念,以及在网络通信中如何使用htons, ntohs, htonl, ntohl等函数进行字节序转换,确保数据在不同系统间正确传输。" 132980665,19694595,斗罗大陆人物关系知识图谱构建与可视化,"['知识图谱构建', '词嵌入', 'Python编程', '数据可视化']
摘要由CSDN通过智能技术生成
不同CPU中,4字节整数1在内存空间的存储方式是不同的。4字节整数1可用2进制表示如下:

00000000 00000000 00000000 00000001

有些CPU以上面的顺序存储到内存,另外一些CPU则以倒序存储,如下所示:

00000001 00000000 00000000 00000000

若不考虑这些就收发数据会发生问题,因为保存顺序的不同意味着对接收数据的解析顺序也不同。

大端序和小端序

CPU向内存保存数据的方式有两种:
  • 大端序(Big Endian):高位字节存放到低位地址(高位字节在前)。
  • 小端序(Little Endian):高位字节存放到高位地址(低位字节在前)。

仅凭描述很难解释清楚,不妨来看一个实例。假设在 0x20 号开始的地址中保存4字节 int 型数据 0x12345678,大端序CPU保存方式如下图所示:

图1:整数 0x12345678 的大端序字节表示

对于大端序,最高位字节 0x12 存放到低位地址,最低位字节 0x78 存放到高位地址。小端序的保存方式如下图所示:

图2:整数 0x12345678 的小端序字节表示

不同CPU保存和解析数据的方式不同(主流的Intel系列CPU为小端序),小端序系统和大端序系统通信时会发生数据解析错误。因此在发送数据前,要将数据转换为统一的格式——网络字节序(Network Byte Order)。网络字节序统一为大端序。

主机A先把数据转换成大端序再进行网络传输,主机B收到数据后先转换为自己的格式再解析。

网络字节序转换函数

在《 使用bind()和connect()函数 》一节中讲解了 sockaddr_in 结构体,其中就用到了网络字节序转换函数,如下所示:

    
    
    
  1. //创建sockaddr_in结构体变量
  2. struct sockaddr_in serv_addr;
  3. memset(&serv_addr, 0, sizeof
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值