现在的位置: 首页 > 综合 > 正文

网络序与主机序(大小端问题)

2013年10月01日 ⁄ 综合 ⁄ 共 813字 ⁄ 字号 评论关闭

    大端小端

    大端小端的叫法是引自《格列佛游记》中的两个国家,其中一个国家规定要从鸡蛋的小的那端将鸡蛋打破,而另一个国家则相反,非要从大的那端将鸡蛋打破。

    计算机中,高位在低字节的就是大端法,低位在低字节的就是小端法。

   

    网络上的字节的传输顺序和主机上的字节表示顺序也一样分大小端,但是目前网络传输序默认是大端传输,而大多数的主机,比如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)

抱歉!评论已关闭.