Python 2.7 socket 的htons

4 投票
1 回答
13658 浏览
提问于 2025-04-17 06:05

我现在正在研究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字节交换的操作。

撰写回答