[英]Python 2.7 socket htons
我目前正在研究python中的套接字编程,并且使用socket.htons()遇到了一些奇怪的行为……似乎在每次调用时都将字节翻转。
据我所知,我正在实现一个简单的ping脚本,网络字节顺序为big endian,而系统字节顺序为little endian。
如果我在我的16位校验和Wireshark上使用htons报告它是不正确的,但是如果我只是将校验和打包到一个结构中而不使用htons wirehark则确认它是正确的。
这是使用htons时wireshark捕获的内容
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
一切看起来都应该正常工作。 即使在您的示例中,这2个字节也被交换,然后再次返回。 如果系统字节顺序与网络相同,则为空,但您的问题是网络字节顺序为Big ,主机为Little ,因此交换是应该做的事情。
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.htons(x)
将主机的16位正整数转换为网络字节顺序。 在主机字节顺序与网络字节顺序相同的机器上,这是一个空操作 ; 否则,它将执行2字节交换操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.