我正在使用这个漂亮的小包“construct”进行二进制数据解析。但是,我遇到了格式定义为:
的情况31 24 23 0
+-------------------------+
| status | an int number |
+-------------------------+
基本上,较高的8位用于状态,3个字节用于整数:具有较高位的int类型被屏蔽掉。我对于定义格式的正确方法有点迷失:
ULInt32
并自行掩盖修改
假设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})
由于
奥利弗
答案 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\x01
为65536 + 256 + 1 = 65793
答案 1 :(得分:0)
BitStruct("foo",
BitField("status", 8),
BitField("number", 24))