构造解析未对齐的int字段?

时间:2012-02-02 21:04:03

标签: python construct

我正在使用这个漂亮的小包“construct”进行二进制数据解析。但是,我遇到了格式定义为:

的情况
31     24 23              0
+-------------------------+
| status |  an int number |
+-------------------------+

基本上,较高的8位用于状态,3个字节用于整数:具有较高位的int类型被屏蔽掉。我对于定义格式的正确方法有点迷失:

  • 蛮力方式是将其定义为ULInt32并自行掩盖
  • 无论如何我可以使用BitStruct来解决问题吗?

修改

假设Little Endian并且基于jterrace的示例和swapped = True建议,我认为这将是我的情况:

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 个答案:

答案 0 :(得分:2)

如果构造包含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\x0165536 + 256 + 1 = 65793

答案 1 :(得分:0)

BitStruct("foo",
          BitField("status", 8),
          BitField("number", 24))