网络字节顺序

高字节和低字节

一. 计算机的数值应视为连续若干个二进制位的集合;

二. 所谓高、低字节就是此集合中位地址高/低的二进制位集合;

三. 例如定义一个unsigned short型变量在0x1234 5678,那么这个变量的地址就是0x1234 5678,占用0x1234 5678与0x1234 5679两字节存储空间,其中0x1234 5678是低字节、0x1234 5679是高字节。

四、 一个16进制数有两个字节组成,例如:A9。

高字节就是指16进制数的前8位(权重高的8位),如上例中的A。

低字节就是指16进制数的后8位(权重低的8位),如上例中的9。

大端模式:将数据的高字节保存在内存的低地址,将数据的低字节保存在内存的高地址,这种存放模式称为大端模式;

小端模式:将数据的高字节保存在内存的高地址,将数据的低字节保存在内存的低地址,这种存放模式称为小端模式;

磁盘文件中的多字节数据相对于文件中的偏移地址有大端、小端之分,内存中的多字节数据相对于内存地址也有大端、小端之分;同样的,网络数据流同样有大端、小端之分;

发送端主机在发送数据时,通常将发送缓冲区中的数据按内存地址从低到高顺序依次发出;接收端主机从网络上接收数据时,会将从网络上接收的数据按内存地址从低到高的顺序依次保存。因此,网络数据流的地址这样规定:先发出的数据占据低地址,后发出的数据占据高地址;

TCP/IP协议规定,网络数据流应采用大端模式存储。举例说明:假设从网络获取了一个16位的数据0x1121,即十进制的4385,那么发送端主机在发送该数据时,会先发送低地址的数据0x21,再发送高地址的数据0x11;假设接收端为此数据分配的地址为0、1,高字节的数据0x11被存放到低地址0所对应的空间;低字节的数据0x21被存放到高地址1所对应的空间。

但是如果发送端主机采用小端模式,那么16位的数据会被解释为0x2111,这显然不正确。因此发送端主机将数据填充到发送缓冲区前要先进性字节顺序转换。

linux提供了一些字节顺序转换的函数,在函数库arpa/inet.h中

unit32_t htonl(unit32_t hostlong);
unit16_t htons(unit16_t hostshort);
unit32_t ntohl(unit32_t netlong);
unit16_t ntohs(unit16_t nettshort);

h代表主机
n代表网络
l代表32位长整型
s代表16位短整型

htonl 表示host to net long

若主机采用大端模式,则这些函数不转换,将参数原样返回。只有主机采用小端模式,参数的字节顺序才会转换

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值