和硬盘打交道,不免会用到字节、大\小端对齐、结构等。C语言定义了很多类型,我们定义一个结构,配合mem***函数、大小端转换宏等几乎可以应付了。Python就没那么好用了,因为它本身也不是为这种低级操作而设计的。处理这种二进制数据,貌似只有struct库能沾上一点边,它用起来像printf,数据一多就会把你搞晕的,它还有几个致命缺点:1. 不支持小于1个字节的;2. 数据格式固定。总的来说,它的扩展性和易用性是很差的。
Construct一改模仿C语言struct的“趋势”,结构体不再是对数据的定义而是描述。这一颠覆性的思想可以说把数据流unpack推向到一个新台阶。我们不再受限于语言本身所定义的类型,而是像正则表达式那样根据数据格式来描述结构。
这种思想也不是Construct首先提出的,一些网络数据包处理程序很早也在使用(Construct最早也是用于处理TCP/IP数据包的)。我们可以看看该库所带的一个处理mbr解析的示例
from construct import *
mbr = Struct("mbr",
HexDumpAdapter(Bytes("bootloader_code", 446)),
Array(4,
Struct("partitions",
Enum(Byte("state"),
INACTIVE = 0x00,
ACTIVE = 0x80,
),
BitStruct("beginning",
Octet("head"),
Bits("sect", 6),
Bits("cy