繁体   English   中英

Python 2.7套接字htons

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM