数字字节序之判断大小头

 一个字节8位刚好存储两个十六进的数字。网络字节序即为大头字节序。

判断当前平台是大头还是小头:
#define BIGENDIAN (htons(1) == 1)
当htons(1) == 1成立时,BIGENDIAN的值就是1,否则为0. 后续代码就可以通过 if (BIGENDIAN) { ……}的形式来判断大小头。


各操作系统都会实现这个函数:
unit16_t htons(uint16_t host);
将16位主机字符顺序转换成网络字符顺序
如果主机字节序是小头,则返回十进制host对应的大头;
如果主机字节序是大头,则返回十进制host对应的大头(即不需要转换,本身就是大头).
主机的字节序是大头还是小头由htons自己去确定。

假设主机为小头字节序,那么十进制数字1(十六进制数字就是0x0001)的主机字节序就是:
0X0100
用htons将0X0100按小头字节序转换为网络字节序(大头)是:
0X0001

即传入参数host为0X0100,返回值就是0X0001。
而因为程序是在当前平台上执行,所以cpu在读取16为short时都是按照本级的字节序小头来读的。
cpu是不知道你返回的值是大头字节序的,它只知道都按本机的小头字节序来读取。
所以传入值为0X0100,即十进制的1;而返回值为0X0001,即256.
转换字节序后,本机cpu读取出来的short的值是不同的。

 假设主机是大头,那么十进制数字1(十六进制数字就是0x0001)的主机字节序就是:
0X0001
htons不用转换,直接返回,因为本身就是网络字节序:
0X0001

即传入参数host为0X0001,返回值也是0X0001。
cpu都会按本机的字节序去读取传入值和返回值:
传入值为0X0001,即十进制的1;而返回值为0X0001,十进制值就是1.
所以如果本机是大头,则htons(1) == 1 成立;否则不成立。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值