我目前正在研究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
答案 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字节 交换操作。