Python 2.7 socket 的htons
我现在正在研究Python中的套接字编程,但在使用socket.htons()时遇到了一些奇怪的情况……每次调用它时,似乎都在翻转字节。
我正在实现一个简单的ping脚本,据我所知,网络字节序是大端序,而我系统的字节序是小端序。
如果我对我的16位校验和使用htons,Wireshark会报告它是错误的;但是如果我直接把校验和打包到一个结构体里,而不使用htons,Wireshark确认它是正确的。
这是Wireshark在使用htons时捕获到的内容:
Checksum: 0xece4 [incorrect, should be 0xe4ec]
这里有一个简单的例子……
>>> z = 0xFF00
>>> print z
65280
>>> z = socket.htons(z)
>>> print z
255
>>> z = socket.htons(z)
>>> print z
65280
对此有什么想法会非常感激,希望只是我做错了什么。
编辑:
>>> print sys.byteorder
little
1 个回答
3
一切看起来都正常。在你的例子中,两个字节被交换,然后又换回来。如果系统的字节顺序和网络的字节顺序是一样的,那就没什么变化,但你提到网络的字节顺序是大端,而主机是小端,所以交换字节是正确的做法。
In [1]: a = 0xECE4
In [2]: b = 0xE4EC
In [3]: a
Out[3]: 60644
In [4]: b
Out[4]: 58604
In [5]: socket.htons(a)
Out[5]: 58604
In [6]: socket.htons(b)
Out[6]: 60644
In [7]: socket.htons(a) == b
Out[7]: True
In [8]: socket.htons(b) == a
Out[8]: True
In [9]: hex(socket.htons(a))
Out[9]: '0xe4ec'
In [10]: hex(socket.htons(b))
Out[10]: '0xece4'
In [11]: bin(socket.htons(a))
Out[11]: '0b1110010011101100'
In [12]: bin(socket.htons(b))
Out[12]: '0b1110110011100100'
来自Python的socket参考:
socket.htons(x)
将16位的正整数从主机字节顺序转换为网络字节顺序。在主机字节顺序和网络字节顺序相同的机器上,这个操作是无效的;否则,它会执行一个2字节交换的操作。