一种强大的二进制数据声明式解析器/生成器
ak-construct的Python项目详细描述
construct是一个强大的declarative解析器(和生成器),用于二进制数据。
不用编写命令代码来解析一段数据,而是声明性地 定义描述数据的数据结构。因为这个数据结构不是 代码,您可以在一个方向上使用它将数据parse解析为pythonic对象, 在另一个方向,将对象转换为二进制数据。
这个库提供了两个简单的原子结构(比如不同大小的整数)。 以及复合的,允许您形成日益复杂的层次结构。 构造特性位和字节粒度,易于调试和测试,以及 易于扩展子类系统,并且有许多原始构造可以使 工作更轻松:
- 字段:原始字节或数字类型
- 结构和序列:将更简单的结构组合成更复杂的结构
- 适配器:更改数据的表示方式
- 数组/范围:重复构造
- 元结构:使用上下文(历史)计算数据大小
- if/switch:基于上下文分支计算路径
- 按需(延迟)分析:只读所需内容
- 指针:在数据流中从这里跳到那里
注意
Construct3是对construct2的重写; 两者不兼容,因此construct3将作为不同的包发布。 构造2.5是2.x代码库的最后一个版本。
构造2.5放弃了构造2.0中添加的实验性文本解析支持; 它效率很低,我选择集中精力处理二进制数据。
示例
PascalString是以其长度为前缀的字符串:
>>> from construct import * >>> >>> PascalString = Struct("PascalString", ... UBInt8("length"), ... Bytes("data", lambda ctx: ctx.length), ... ) >>> >>> PascalString.parse("\x05helloXXX") Container({'length': 5, 'data': 'hello'}) >>> PascalString.build(Container(length = 6, data = "foobar")) '\x06foobar'
与其手动指定长度,不如使用适配器:
>>> PascalString2 = ExprAdapter(PascalString, ... encoder = lambda obj, ctx: Container(length = len(obj), data = obj), ... decoder = lambda obj, ctx: obj.data ... ) >>> PascalString2.parse("\x05hello") 'hello' >>> PascalString2.build("i'm a long string") "\x11i'm a long string"
查看file formats的更多示例 和network protocols 在仓库里。
资源
construct的主页是http://construct.readthedocs.org,在这里您可以找到各种各样的 文件和资源。图书馆本身是在github开发的; 请使用github issues报告错误,并且 Github请求发送修补程序。对于一般性讨论或问题,请使用 new discussion group。