按照官网文档的介绍,Construct 库是一个二进制数据的解析工具包。当然也可以进行逆操作,将结构化对象保存为二进制数据。
安装用pip install construct 就OK。
现在用几个简单的例子说明一下基本用法
例1
from construct import *
A = Int32ub
res = A.parse(b'\x00\x00\x00\x01')
print(res)
结果为
1
将原始的4个字节的二制数据b’\x00\x00\x00\x01’ 解析成为一个32位整数
其它可以解析的数据类型很多,详细的可以查看 《Construct的官方文档》
下面的几个例子是我随便选的,只是想验证一些自己的想法,不一定有全面的代表性
例2
from construct import *
ST1 = Struct(
Const(b'a'),
'v'/Byte
)
res = ST1.parse(b'a\x01\x02\x03\x04')
结果为
Container:
v = 1
注意结果中只有 v ,Const是不包含在结果中,如果要想在结果中包含常数,可如下
例3
from construct import *
ST1 = Struct(
'k'/Const(b'a'),
'v'/Byte
)
res = ST1.parse(b'a\x01\x02\x03\x04')
结果为
Container:
k = b'a' (total 1)
v = 1
这时结果中就包含了常量串字段。注意一下例2与例3的区别
例4
from construct import *
ST1 = Struct(
Const(b'a'),
'v'/Byte
)
ST2 = Struct(
Const(b'b'),
'v'/Byte
)
A = Sequence(Select(ST1, ST2),Select(ST1, ST2))
res = A.parse(b'a\x01b\x02\x03\x04')
结果为
ListContainer:
Container:
v = 1
Container:
v = 2
上面例子中的Select表示选择一个可以匹配得上的结构对二进制数据进行解析,如果找到了,就返回第一个匹配得上的,如果一个都匹配不,就返回None
更多的情形读者可以自已慢慢研究。
特别说明一点:现在发布的Construct 2.9版与以前的版本相比可以说进行了非常大,非常大的改动。我就是因为以前的一个python项目中用到了construct, 用2.9版执行时发生了非常多的错误。可以说以前用到construct的源码必须要彻底的检查和重写才行。