通过结构对二进制数据进行读/写访问的库
binstruct的Python项目详细描述
binstruct库允许您使用预定义的 结构。二进制数据可以以允许索引的任何形式提供 访问单个字节。例如,这可能是一个mmaped文件。数据 结构本身的定义方式与django数据库表定义类似 通过声明一个新类及其字段。
简单示例
首先,必须定义要用于访问 二进制数据。这是通过指定所有需要的字段及其类型和 他们在一个新班级里的位置。作为一个例子,让我们以 elf header在c中应该是这样的
#define EI_NIDENT 16 typedefstruct{unsignedchare_ident[EI_NIDENT];uint16_te_type;uint16_te_machine;uint32_te_version;// rest of the fields omitted for simplicity }ElfN_Ehdr;
现在,使用binstruct声明以下python类
frombinstructimport*classElfN_Ehdr(StructTemplate):e_ident=RawField(0,16)e_type=UInt16Field(16)e_machine=UInt16Field(18)e_version=UInt32Field(20)
请注意,您必须指定字段的偏移量,即使它是 可以从前面字段的大小中导出。我选择了这个 解决方案,因为它使实现更容易,并且允许 更容易跳过不相关或保留的字段。
现在我们可以通过提供构造函数 可索引的数据结构和偏移量。可索引的数据结构是 表示二进制数据的python对象 访问”。偏移允许您将结构放置在 可索引的数据结构。
对于本例,我们只需为二进制数据使用一个简单的列表
binary_data=24*[0]header=ElfN_Ehdr(binary_data,0)
现在您可以简单地读写任何字段
header.e_type=0x0header.e_ident[0]=0x7fheader.e_ident[1]=ord('E')header.e_ident[2]=ord('L')header.e_ident[3]=ord('F')print(header.e_type)print(header.e_ident[1])
当前实现为8位提供有符号和无符号字段, 16位和32位整数、字符串、原始数据字段,甚至嵌套 结构。对于如何使用它们的一些想法,还可以查看单元测试。
贡献
这个库是完全独立的,只需要py.test来运行这个单元 测验。要进行任何更改,只需在github上克隆项目: https://github.com/Jokymon/binstruct,将更改推送到自己的github 投射并发送拉取请求。如有任何更改,请确保 单元测试。