【发布时间】:2011-11-04 03:09:47
【问题描述】:
我正在为二进制格式编写解析器。这种二进制格式涉及不同的表,这些表又是二进制格式,通常包含不同的字段大小(大约在 50 到 100 个之间)。
这些结构中的大多数都有位域,并且在用 C 表示时看起来像这样:
struct myHeader
{
unsigned char fieldA : 3
unsigned char fieldB : 2;
unsigned char fieldC : 3;
unsigned short fieldD : 14;
unsigned char fieldE : 4
}
我遇到了 struct 模块,但意识到它的最低分辨率是一个字节而不是位,否则该模块非常适合这项工作。
我知道使用 ctypes 支持位域,但我不确定如何在此处连接包含位域的 ctypes 结构。
我的另一个选择是自己操作这些位并将其输入字节并与 struct 模块一起使用 - 但由于我有接近 50-100 种不同类型的此类结构,因此编写代码变得更容易出错.我也担心效率,因为这个工具可能会被用来解析大量的二进制数据。
谢谢。
【问题讨论】:
-
还有第 3 方位数组/位操作库。
-
这将是相当多的工作,但您可能会设计一个类,该类可以将 C 风格的结构定义(或类似它们消除包装歧义的东西)解析为一组掩码,为每个位域,通过struct模块读入数据到字节级别,提供
__getattr__访问权限。 -
是的,我现在遇到了这些工具 - python-bitstring、Construct、BitReader - 并阅读了他们的文档。 Bit Reader 似乎是一个可行的解决方案,但我看到here 的性能将会大受欢迎。据我所知,从他们的基本文档中可以找到不支持位字段的构造。 Python-bitstring 听起来很有希望,需要深入挖掘
-
是的,Russell 是我目前的最后一个选择——类似于更高级别的抽象,以支持带有 struct 模块的位域。
标签: python struct ctypes binary-data bit-fields