Python 2.7 socket htons

4

我目前正在研究Python中的socket编程,但是我在使用socket.htons()时遇到了一些奇怪的行为...它似乎在每次调用时都会翻转字节。

我正在实现一个简单的ping脚本,据我所知,网络字节顺序是大端字节序,而我的系统字节顺序是小端字节序。

如果我对我的16位校验和使用htons,Wireshark报告说它是不正确的,但是如果我只是将校验和打包到一个结构体中而没有使用htons,Wireshark确认它是正确的。

这是在使用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

你能否包含以下输出:print sys.byteorder,以便再次检查字节序吗? - chown
1
你的例子没有问题。每次调用 htons() 都会翻转传递给它的参数的字节顺序。毕竟,它是无状态的,数据本身没有任何信息表明“我是大端序”或“我是小端序”。 - vanza
我认为这个例子有点不可靠。在htons的文档中,它说:“在主机字节顺序与网络字节顺序相同的计算机上,这是一个无操作;”因此,调用htons应该始终为我提供具有正确字节顺序的校验和,而不管我的系统的字节顺序如何? - DarkRyuu
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字节交换操作。


谢谢,这解决了我对htons工作方式的误解。这表明问题实际上在我的校验和代码中。谢谢 =] - DarkRyuu
@DarkRyuu:一定要先检查自己的代码。不要假设第三方代码存在错误,特别是当涉及到经过充分测试的系统库时。 - Cat Plus Plus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接