大端小端
大端小端的叫法是引自《格列佛游记》中的两个国家,其中一个国家规定要从鸡蛋的小的那端将鸡蛋打破,而另一个国家则相反,非要从大的那端将鸡蛋打破。
计算机中,高位在低字节的就是大端法,低位在低字节的就是小端法。
网络上的字节的传输顺序和主机上的字节表示顺序也一样分大小端,但是目前网络传输序默认是大端传输,而大多数的主机,比如windows,linux都是小端序,所以一般都需要转换。
了解了这个概念之后,我们来做个小测试,下面这幅图中的字节序是什么?
在unix上网络序和主机序有如下转换的函数可以调用(ntohs代表network to host)
#define ntohs(n) //16位数据类型网络字节顺序到主机字节顺序的转换
#define htons(n) //16位数据类型主机字节顺序到网络字节顺序的转换
#define ntohl(n) //32位数据类型网络字节顺序到主机字节顺序的转换
#define htonl(n) //32位数据类型主机字节顺序到网络字节顺序的转换
之前遇到一个大小端的问题,需要通过网络传输主机ip和端口号,写了如下一段程序
hostArr = host.split('.')
return struct.pack('4B1H', int(hostArr[0]), int(hostArr[1]), int(hostArr[2]), int(hostArr[3]),port)
结果老是不通,让我绞尽脑汁,后来才想到可能是端口这个16位的整数有可能是反的(16位整数需要2字节,所以存在大小端的问题,之前的四个8位字节就不会了),手动换过来以后就正确了,python中是这样处理网络序的,注意细微的差别
return struct.pack('!4B1H', int(hostArr[0]), int(hostArr[1]), int(hostArr[2]), int(hostArr[3]),port)