4

我正在使用这个漂亮的小包“ 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})

谢谢

奥利弗

4

2 回答 2

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\x01值为65536 + 256 + 1 = 65793

于 2012-02-02T21:23:26.263 回答
0
BitStruct("foo",
          BitField("status", 8),
          BitField("number", 24))
于 2012-02-02T21:14:57.553 回答