Python 2.7 сокет htons - PullRequest
       5

Python 2.7 сокет htons

2 голосов
/ 11 ноября 2011

В настоящее время я изучаю программирование сокетов в python и испытываю странное поведение с socket.htons () ... похоже, что при каждом вызове он переворачивает байты.

Я реализую простой сценарий проверки связи, поскольку я знаю, что порядок байтов в сети имеет большой порядок байтов, а порядок в моих системных байтах - это порядок байтов.

Если я использую htons в моей 16-битной контрольной сумме, 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

Буду очень признателен за любые мысли по этому поводу, надеюсь, я просто что-то сделал очень неправильно.

Edit:

>>> print sys.byteorder
little

1 Ответ

1 голос
/ 11 ноября 2011

Все выглядит так, как должно.Даже в вашем примере 2 байта меняются местами, а затем снова.Если системный порядок байтов такой же, как и в сети, то он не работает, но ваш вопрос утверждает, что сетевой порядок байтов равен Большой , а хост - Маленький , поэтомуобмен это то, что он должен делать.

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.htons(x)
Конвертировать 16-битные положительные целые числа от хоста до сетевого порядка байтов. На машинах, где порядок байтов хоста совпадает с порядком байтов в сети, это no-op ;в противном случае он выполняет операцию 2-байтового обмена .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...