Python 2.7套接字htons

时间:2011-11-11 00:29:26

标签: python sockets

我目前正在研究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 个答案:

答案 0 :(得分: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'

来自python socket reference

  

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