Построить разбор для невыровненного поля int? - PullRequest
4 голосов
/ 03 февраля 2012

Я использую этот симпатичный маленький пакет " construct " для анализа двоичных данных. Тем не менее, я столкнулся со случаем, когда формат определяется как:

31     24 23              0
+-------------------------+
| status |  an int number |
+-------------------------+

Как правило, старшие 8 бит используются для статуса, а 3 байта оставляются для целого числа: тип int с маскированными старшими битами. Я немного растерялся из-за правильного определения формата:

  • Способ грубой силы состоит в том, чтобы определить его как ULInt32 и маскировать себя
  • Можно ли в любом случае использовать BitStruct для решения проблемы?

Редактировать

Предполагая Little Endian и основываясь на примере jterrace и меняя местами = Истинное предложение, я думаю, что это будет работать в моем случае:

sample = "\xff\x01\x01\x01"
c = BitStruct("foo", BitField("i", 24, swapped=True), BitField("status", 8))
c.parse(sample)
Container({'i': 66047, 'status': 1})

Спасибо

Оливер

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Это было бы легко, если бы конструкция содержала типы Int24, но это не так. Вместо этого вы можете сами указать длину в битах так:

>>> from construct import BitStruct, BitField
>>> sample = "\xff\x01\x01\x01"
>>> c = BitStruct("foo", BitField("status", 8), BitField("i", 24))
>>> c.parse(sample)
Container({'status': 255, 'i': 65793})

Примечание: значение \x01\x01\x01 равно 65536 + 256 + 1 = 65793

0 голосов
/ 03 февраля 2012
BitStruct("foo",
          BitField("status", 8),
          BitField("number", 24))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...