小贴士
Construct库目前分为两大版本:Version 2.5.5 和 Version 2.8。
2.5版本是老版本,现在基本不维护了。2.8版本是2016年9月份发布。在API接口和实现上有着重大的改变。字段是无命名的,而且操作符
/ >> []
被用于创建结构体(Struct),序列(Sequences)和范围(Ranges)。
Construct是一个强大的描述式解析和构建二进制数据库。
几个重要的原始结构:
-
Fields:原始字节或数字类型
-
Structs and Sequences:将简单,基本的结构组装成更加复杂的结构
-
Bitwise:提供字节的build和sparse接口,针对bit-string
-
Adapters:改变数据的展现形式
-
Arrays/Ranges:重复的结构
-
Meta-constructs:使用context(history)去计算数据的大小
-
If/Switch:branch the computational path based on the context
-
On-demand(lazy) parsing: 读取与解析,在你需要的时候
- Pointers:指针
核心任务
二进制的数据处理怎么存在两个大的需求:一个是构建(build),有时也称为编码(encode);另一个就是解析(parse),有时也称为解码(decode)。
处理基础
对于python这种高级语言,对内存的操作是很有限的,基本是面对的字节进行,即8个bit。这样面对的对象,就有基本对象就有两种形式。
-
Byte-string(字节流)
- Bit-string(位流)
bit-string在python中的处理其实也是转换成Byte-string进行的。
二进制处理的本质是什么
把一个byte-string或者bit-string按照一定的格式进行划分,翻译。
类详解Bitwise与Bytewise
怎么去理解这两个类呢?
直白点说,这两个转换类,就是byte-string 与 bit-string之间的桥梁,可以理解成一种等价变换的关系。
传递过程:byte--->bit 把基于字节的输入转为bit-string,长度要能对应上。
例1
from construct import *
# 输入是正常的的整数,内部类是bit-string,所以需要经过Bitwise转换
d = Bitwise(BitsInteger(8))
d.build(255)
# 输出:'\xff'
传递过程:bit--->byte
例2
from construct import *
# bit--->byte,外是bit-string对应内部的byte,长度由内部决定
d = Bytewise(Byte)
d.build(2)
#输出:'\x00\x00\x00\x00\x00\x00\x01\x00'