构建非对齐整数字段的解析方法?
我正在使用一个很不错的工具包 "construct" 来解析二进制数据。不过,我遇到了一个情况,格式是这样定义的:
31 24 23 0
+-------------------------+
| status | an int number |
+-------------------------+
简单来说,前面8位用来表示状态,剩下的3个字节用来表示一个整数:也就是一个整数类型,但高位被遮罩掉了。我有点搞不清楚该怎么正确地定义这个格式:
- 一种简单粗暴的方法是直接定义为
ULInt32
,然后自己处理位遮罩 - 有没有什么办法可以用 BitStruct 来省去这个麻烦呢?
编辑
假设是小端格式,并根据 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})
谢谢
Oliver
2 个回答
0
BitStruct("foo",
BitField("status", 8),
BitField("number", 24))
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
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