二进制数据解析器和构建器 Construct

MIT
Python
跨平台
2017-04-08
Kinegratii

Construct是一款声明式的二进制数据解析器和构建器。

简而言之,它是对标准模块struct的封装和增强,适用于描述基于二进制数据通信协议的数据结构,可视为二进制数据的Python ORM库。

概述

您不必编写命令式代码来解析一段数据,而是以声明方式定义和描述二进制的数据结构。由于此数据结构不是代码,一方面您可以使用它来将数据解析成Pythonic对象,另一方面,您也可以将pythonict对象构建为二进制数据。

Construct库提供了简单的原子结构(例如各种大小的整数)以及复合的构造,适用于建立日益复杂的分层和顺序结构。Construct拥有基于特征位(bit)和字节(byte)粒度的构建,易于调试和测试,易于扩展的子类系统,以及大量原始构造,使您的工作更轻松:

字段(Field):原始字节或数字类型
结构和序列(Structs and Sequences):将更简单的结构组合到更复杂的结构中
按位(Bitwise):将字节分割为位粒度字段
适配器(Adapter):更改数据的显示方式
数组/范围(Arrays/Ranges):重复构造
元结构(Metaclass):使用上下文(历史)来计算数据的大小
条件(If / Switch):根据上下文分支计算路径
按需(懒惰)解析(Lazy ):只读和解析你需要的东西
指针(Pointers):从这里跳到数据流中

基础用法

Struct例子,与python字典的相对应,Container类类似于字典。

>>> 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])

Repeaters例子,与列表相对应,每个元素类型都相同。具体还分为Arrays,Ranges,GreedyRange 和 RepeatUntil 四种子类型。以下是Arrays的例子

>>> Byte[10].parse(b"1234567890")
[49, 50, 51, 52, 53, 54, 55, 56, 57, 48]
>>> Byte[10].build([1,2,3,4,5,6,7,8,9,0])
b'\x01\x02\x03\x04\x05\x06\x07\x08\t\x00'

Sequence例子,与列表相对应,每个元素可以是任意原子或者组合的数据。

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

高级用法

4字节存储一个IPv4地址,利用Adapter定义如下:

>>> class IpAddressAdapter(Adapter):
...     def _encode(self, obj, context):
...         return list(map(int, obj.split(".")))
...     def _decode(self, obj, context):
...         return "{0}.{1}.{2}.{3}".format(*obj)
...
>>> IpAddress = IpAddressAdapter(Byte[4])

解析和构建用法如下:

>>> IpAddress.parse(b"\x01\x02\x03\x04")
'1.2.3.4'
>>> IpAddress.build("192.168.2.3")
b'\xc0\xa8\x02\x03'
加载中

评论(0)

暂无评论

暂无资讯

暂无问答

复制构造函数总结

1.用同一类型的对象来初始化另一对象需要调用复制构造函数 例1: class A { public: A(){} A(const A& a){cout<<"copy"<<endl;} }; int main() { A a, c; A b = a;//显式复制构造函数(1...

2016/06/13 13:26
3
0
thinkphp _initialize 和 __construct函数的关系

thinkphp _initialize 和 __construct函数的关系

2016/01/26 19:55
197
1
ThinkPHP中initialize和construct的不同

Controller类提供了一个初始化方法_initialize接口,可以用于扩展需要,_initialize方法会在所有操作方法调用之前首先执行 ThinkPHP中initialize()和construct()这两个函数都可以理解为构造函...

2016/11/11 18:46
16
0
java代码执行顺序

一、java代码执行顺序(理解形式):1、父类静 态代码块->子类静态代码块(只执行一次); 2、父类成员变量的初始化或普通代码块->父类构造函数; 3、子 类成员变量的初始化或普通代码块->子类...

2012/12/11 16:29
21
0
PHP浅谈__construct()的继承与调用

PHP浅谈__construct()的继承与调用

2015/04/16 13:24
167
0
通过一道面试题来看 C++ 语言中的表达式求值

题目一: int a = 10 ,b = 6 ; cout << a + b << " " << a ++<< " " << b ++ ; 请说出上述语句的执行结果。 很多人看过这段代码后估计都会直接就写上了 16 10 6 这样的结果吧,但上机实验的输...

2013/02/18 18:56
278
0
通过一道面试题来看 C++的RVO 优化

题目二: 题目我做了下改变,使用了上篇文章(http://my.oschina.net/u/90679/blog/109042)中提到的那个类X,代码如下: 1 class X 2 { 3 public: 4 X(){cout<<"default construct"<<endl;...

2013/02/18 18:41
227
0
MySQL 字段类型 整理 (空间几何类型 以及 整形类型)附:MySQL空间相关函数一览表

MySQL空间扩展支持几何数据的存储,生成,分析,优化。 MySQL中空间几何类型: Point (简单点) linestring (简单线) polygon (简单面) MULITIPOINT:多点 MULITILINESTRING:多线 MUILIT...

2018/12/20 13:43
0
0
CI等MVC框架中为什么不能有index控制器的原因

因为 类名称是index 而方法又是index,这样index函数就是php4中的构造函数,即实例化类时,直接执行这个函数而没有执行父类的构造函数,也就没有初始化CI核心类。所以会提示没有定义属性或方...

2012/12/11 00:15
66
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部