Skip to main content

用于二进制数据的强大的声明性对称解析器/构建器

项目描述

Construct 是用于二进制数据的强大的声明性对称解析器和构建器。

您无需编写命令式代码来解析一段数据,而是以声明方式定义描述数据的数据结构。由于此数据结构不是代码,因此您可以在一个方向使用它来将数据解析为 Pythonic 对象,并在另一个方向将对象构建为二进制数据。

该库提供了简单的原子结构(例如各种大小的整数),以及允许您形成复杂度不断增加的层次结构和顺序结构的复合结构。Construct 具有位和字节粒度,易于调试和测试,易于扩展的子类系统,以及许多使您的工作更轻松的原始构造:

  • 字段:原始字节或数字类型

  • 结构和序列:将更简单的结构组合成更复杂的结构

  • 按位:将字节拆分为位粒度字段

  • 适配器:改变数据的表示方式

  • 数组/范围:重复结构

  • 元构造:使用上下文(历史)来计算数据的大小

  • if/Switch:根据上下文分支计算路径

  • 按需(惰性)解析:仅读取和解析您需要的内容

  • 指针:在数据流中从这里跳转到那里

  • 隧道:使用字节数为数据添加前缀或对其进行压缩

例子

Struct是有序的命名字段的集合:

>>> format = Struct(
...     "signature" / Const(b"BMP"),
...     "width" / Int8ub,
...     "height" / Int8ub,
...     "pixels" / Array(this.width * this.height, Byte),
... )
>>> format.build(dict(width=3,height=2,pixels=[7,8,9,11,12,13]))
b'BMP\x03\x02\x07\x08\t\x0b\x0c\r'
>>> format.parse(b'BMP\x03\x02\x07\x08\t\x0b\x0c\r')
Container(signature=b'BMP')(width=3)(height=2)(pixels=[7, 8, 9, 11, 12, 13])

Sequence是有序字段的集合,与ArrayGreedyRange的不同之处在于这两者是同质的:

>>> format = Sequence(PascalString(Byte, "utf8"), GreedyRange(Byte))
>>> format.build([u"lalaland", [255,1,2]])
b'\nlalaland\xff\x01\x02'
>>> format.parse(b"\x004361789432197")
['', [52, 51, 54, 49, 55, 56, 57, 52, 51, 50, 49, 57, 55]]

项目详情


发布历史 发布通知| RSS订阅

2.8.13