【问题标题】:Python 2.7 socket htonsPython 2.7 套接字 hton
【发布时间】: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 的调用都应该始终给我正确字节顺序的校验和?

标签: python sockets


【解决方案1】:

一切看起来都在正常工作。即使在您的示例中,也正在交换 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'

来自pythonsocket reference

socket.htons(x)
将 16 位正整数从主机转换为网络 字节顺序。 在主机字节顺序与 网络字节顺序,这是一个no-op;否则,它执行 2 字节 交换操作。

【讨论】:

  • 谢谢,这消除了我对 htons 工作原理的误解。这表明问题实际上出在我的校验和代码中。谢谢=]
  • @DarkRyuu:总是首先检查你的代码。不要假设第三方代码存在错误,尤其是在涉及经过良好测试的系统库时。
猜你喜欢
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2011-08-26
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多