【发布时间】:2011-11-11 08:48:29
【问题描述】:
我目前正在研究 python 中的套接字编程,并且我在使用 socket.htons() 时遇到了一些奇怪的行为......它似乎在每次调用时都会翻转字节。
我正在实现一个简单的 ping 脚本,据我所知网络字节顺序是 big endian 而我的系统字节顺序是 little endian 。
如果我在我的 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
【问题讨论】:
-
您能否将
print sys.byteorder的输出包括在内,以便仔细检查字节序? -
你的例子没有错。对
htons()的每次调用都会翻转传递给它的参数的字节。它是无状态的,毕竟数据本身并没有说“我是大端”或“我是小端”。 -
我认为这个例子有点粗略。在 htons 的文档中它说..“在主机字节顺序与网络字节顺序相同的机器上,这是一个无操作;”所以无论我的系统的字节顺序如何,对 htons 的调用都应该始终给我正确字节顺序的校验和?