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

发布于 2025-01-02 03:35:10 字数 734 浏览 2 评论 0原文

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

谢谢

Oliver

I am using this nice little package "construct" for binary data parsing. However, I ran into a case where the format is defined as:

31     24 23              0
+-------------------------+
| status |  an int number |
+-------------------------+

Basically, the higher 8 bits are used for status, and 3 bytes left for integer: an int type with higher bits masked off. I am a bit lost on what is the proper way of defining the format:

  • The brute force way is to define it as ULInt32 and do bit masking myself
  • Is there anyway I can use BitStruct to save the trouble?

Edit

Assuming Little Endian and based on jterrace's example and swapped=True suggestion, I think this is what will work in my case:

sample = "\xff\x01\x01\x01"
c = BitStruct("foo", BitField("i", 24, swapped=True), BitField("status", 8))
c.parse(sample)
Container({'i': 66047, 'status': 1})

Thanks

Oliver

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

十级心震 2025-01-09 03:35:10

如果构造包含 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

This would be easy if construct contained Int24 types, but it doesn't. Instead, you can specify the bit lengths yourself like this:

>>> 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})

Note: The value \x01\x01\x01 is 65536 + 256 + 1 = 65793

天邊彩虹 2025-01-09 03:35:10
BitStruct("foo",
          BitField("status", 8),
          BitField("number", 24))
BitStruct("foo",
          BitField("status", 8),
          BitField("number", 24))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文