Структура Python, размер изменен выравниванием. - PullRequest
1 голос
/ 06 ноября 2010

Вот шестнадцатеричный код, который я пытаюсь распаковать.b'ABCDFGHa \ x00a \ x00a \ x00a \ x00a \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x01 '(это не имеет никакого смысла)

labels = unpack('BBBBBBBHHHHH5sB', msg)
struct.error: unpack requires a bytes argument of length 24

Из того, что я посчитализ них длина = 23, формат в моей функции распаковки и длина шестнадцатеричных значений.Я не понимаю.

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 06 ноября 2010

Большинство процессоров получают доступ к данным быстрее, когда данные находятся на естественных границах, то есть данные размера 2 должны быть на четных адресах, данные размера 4 должны быть доступны на адресах, кратных четырем, и т. Д.

struct по умолчанию поддерживает это выравнивание.Поскольку ваша структура начинается с 7 'B', добавляется байт заполнения для выравнивания следующего 'H' по четному адресу.Чтобы предотвратить это в Python, перед вашей строкой введите '='.

Пример:

>>> import struct
>>> struct.calcsize('BBB')
3
>>> struct.calcsize('BBBH')
6
>>> struct.calcsize('=BBBH')
5
2 голосов
/ 06 ноября 2010

Я думаю, H обеспечивает 2-байтовое выравнивание после ваших 7 B

Ага, информация о выравнивании находится вверху http://docs.python.org/library/struct.html,, а не на определении символов формата .

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