构建非对齐整数字段的解析方法?

4 投票
2 回答
799 浏览
提问于 2025-04-17 12:13

我正在使用一个很不错的工具包 "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

撰写回答