一种强大的二进制数据声明式解析器/生成器

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

要求

构造应该在任何python 2.5-3.5或pypy实现上运行。

它的唯一要求是six,它用于克服 python 2和3之间的区别。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
mysql java语言非法参数异常?   java绘制控制流图   无法通过java eclipse中的ssh隧道远程连接到mysql数据库   直接在@SuppressWarnings之后出现java Eclipse错误(“未选中”)   java如何使用远程api google应用程序引擎api客户端?   工具栏中的java导航图标颜色未更改?   java返回带有映射子集的实体   java Spring重新加载属性Bean未更新   fileoutputstream正在获取java。木卫一。IOException:流关闭错误,但未显式关闭它   jsp标记显示java。时间使用jstl的LocalDateTime   java如何设置onFailure事件(Spring,Kafka)的超时?   将java元素添加到多个线程中的列表时,会跳过这些元素   JAVAutil。扫描程序Java读取空格后的整数值   java JMonkey过滤器着色器获取片段的世界位置   java从mongodb获取随机值   java如何使用Intent。标记\u活动\u清除\u顶部以清除活动堆栈?   多线程如何控制在多个端口上监听的java服务器应用程序   在具有复合键的相关实体之间插入数据时发生java Hibernate错误