在Python的construct modu中从BitStruct获取字符串

2024-06-10 17:47:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python construct解析器来处理一些二进制数据,但无法以我期望的方式获得字符串。在

请注意,在下面的简化示例中,我可以使用unpack甚至只是一个片段,但是我正在解析的实际数据并没有整齐地与字节边界对齐。在

一些示例代码:

from construct import BitStruct, BitField, Padding, String

struct = BitStruct("foo",
  BitField("bar", 8),
  BitField("baz", 16),
  Padding(4),
  BitField("bat", 4)
)

struct2 = BitStruct("foo",
  BitField("bar", 8),
  String("baz", 16),
  Padding(4),
  BitField("bat", 4)
)

data = "\x01AB\xCD"

print struct.parse(data)
print struct2.parse(data)

这将打印输出:

^{pr2}$

我原以为String会将AB作为一个实际字符串返回给我。但是它返回的是等效的二进制字符串。在

如何说服construct返回实际的ASCII字符串?在


Tags: 数据字符串示例datastringfoo二进制bar
2条回答

python模块bitstruct也可用于解析位字段。它使用格式字符串,就像标准的library struct模块一样。在

格式说明符“t”用于文本。在

>>> from bitstruct import unpack
>>> data = b'\x01AB\xCD'
>>> unpack("u8u16p4u4", data)
(1, 16706, 13)
>>> unpack("u8t16p4u4", data)
(1, u'AB', 13)

我通过创建一个Adapter来解决这个问题。原始的ASCII值被解析成一个整数列表,然后这些整数可以转换成字符串表示。在

这不是最优雅的方法,但由于BitStruct只对位值进行操作,所以它似乎是最简单的解决方法。改进后的版本将解析不同长度的字符串(例如7位ASCII)。在

from binascii import hexlify
from construct import BitStruct, BitField, Padding, Array, Octet, Adapter

class BitStringAdapter(Adapter):
  def _encode(self, obj, context):
    return list(ord(b) for b in obj)
  def _decode(self, obj, context):
    return "".join(chr(b) for b in obj)

struct = BitStruct("foo",
  BitField("bar", 8),
  BitStringAdapter(Array(2, Octet("baz"))),
  Padding(4),
  BitField("bat", 4)
)

data = "\x01AB\xCD"

out = struct.parse(data)
print hexlify(struct.build(out))

该输出:

^{pr2}$

这是正确的-C字节被丢弃,因为它被标记为填充,这是可以的。在

相关问题 更多 >