通过结构对二进制数据进行读/写访问的库

binstruct的Python项目详细描述


binstruct库允许您使用预定义的 结构。二进制数据可以以允许索引的任何形式提供 访问单个字节。例如,这可能是一个mmaped文件。数据 结构本身的定义方式与django数据库表定义类似 通过声明一个新类及其字段。

Current build statusTest coveragePyPI versionSupported Python versionsEgg StatusWheel StatusLicense

简单示例

首先,必须定义要用于访问 二进制数据。这是通过指定所有需要的字段及其类型和 他们在一个新班级里的位置。作为一个例子,让我们以 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 投射并发送拉取请求。如有任何更改,请确保 单元测试。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
带子字符串的java StringIndexOutOfBoundsException   多线程为什么线程池中的任务不在FIFO、Java之后执行   java setText因NullPointerException而失败   java如何捕获SDBUS:C++中的错误异常?   java如何在apachebeam中进行SQL转换时将int转换为boolean   java和spring中的JCR是什么   java在weblogic服务器上部署Spring boot web app后,错误为ORA01427:singlerow子查询返回多行   Java序列化效率   java如何在请求参数spring中使用对象编码url字符串   java Apache Spark流媒体定制接收器(socket服务器)   java为什么我的stdout不能使用ZeroTurnound重定向输出实时流式传输   指针有一个对象的变量指向Java中另一个对象的变量   java向JPanel添加垂直滚动能力   java让ghostscript接收名称中带有空格的文件(比如“我的文档”中的某些内容)   java如何在php中引用其他对象?   java Android致命异常线程层次结构(请解释)   sql java sql查询错误   在java中刷新outputscreen并同时获取输入   Java 6语言与C#3.0语言的比较