обратный метеородер python от сетевого сервиса - PullRequest
1 голос
/ 31 июля 2011

Я получаю следующие байты от сетевой службы: \x83\x08\x04\x04\x60\x02\x00\x81\x15\x01\x01 Это 8-битное число. Я хочу изменить представление на представление моей системы (32 бита), чтобы иметь возможность работать с байтами. Как бы я сделал это с питоном? Для этого есть специальная «обратная» функция?

С наилучшими пожеланиями

Ответы [ 5 ]

1 голос
/ 31 июля 2011

Если у вас есть 8-битные числа, порядок байтов не имеет значения, поскольку в каждом из них есть только один байт. Если вы хотите преобразовать каждый символ в целое, вы можете написать:

struct.unpack("11B", "\x83\x08\x04\x04\x60\x02\x00\x81\x15\x01\x01")

или

struct.unpack("!11B", "\x83\x08\x04\x04\x60\x02\x00\x81\x15\x01\x01")

или

map(ord, "\x83\x08\x04\x04\x60\x02\x00\x81\x15\x01\x01")

Это эквивалентно. Если строка содержит 16-битные или 32-битные целые числа, вы можете написать что-то вроде:

struct.unpack("!IIHB", "\x83\x08\x04\x04\x60\x02\x00\x81\x15\x01\x01")

, который будет декодирован как два 4-байтовых, одно 2-байтовое и одно 1-байтовое целое число без знака. ! (что соответствует старшему порядковому порядку байтов >) означает, что строка имеет сетевой порядок байтов, поэтому все целые числа, превышающие один байт, могут быть правильно преобразованы в ваш собственный порядок байтов.

РЕДАКТИРОВАТЬ: Если вам нужно получить одиннадцать чисел и обработать их в обратном порядке, вы должны использовать один из указанных выше методов и вызвать reversed, например: reversed(map(ord, data)); но это меняет порядок независимо от вашего собственного порядка байтов. Ты не сказал, что на самом деле представляют собой данные, и я не уверен, что здесь важен порядок байтов.

1 голос
/ 31 июля 2011

Если вы хотите инвертировать все байты в строке, вы можете сделать это:

'example string'[::-1]

Я бы порекомендовал модуль struct для распаковки сетевых или других двоичных данных, так как в противном случае у вас нет хорошего способа определить, где именно должно произойти обращение. Позволяет указать порядок байтов.

1 голос
/ 31 июля 2011

Определите, в каком порядке байтов находятся байты, и введите правильный символ порядка байтов в struct.unpack.

0 голосов
/ 31 июля 2011

Вы смотрели на ядро ​​ struct библиотеки?У него есть методы для преобразования байтовых порядков.

0 голосов
/ 31 июля 2011

Я не уверен, что вы подразумеваете под 8308040460020081150101, но в пакете struct должно быть все необходимое.

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