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

    大端小端

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

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

   

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



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值