数字字节序之判断大小头

 一个字节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 成立;否则不成立。

你可能感兴趣的:(网络,存储,平台)