0 背景
在工作中,有些二进制文件,是通过结构体写入文件而形成,我们有时候想解析这些文件,那如何操作呢?python 的struct 模块和C 语言的结构体是相对应的,这样,只要知道结构体的定义,我们就可以通过struct 模块写出一些解析工具。
1. strcut 模块介绍
class struct.Struct(format)
返回:一个struct 对象(相对于C 的结构体)
作用:该对象可以根据 格式化字符串的格式 来读写二进制数据。
参数:格式化字符串(类似C语言中printf 打印输出的格式化字符串),其中第一个字符,指定字节的顺序(大端或者小端)。
注意:以大端或者小端的方式读写数据可以根据系统默认,不用指定;但是也可以指定。
例:struct.Struct('>I4sf') 里面的格式化字符串,参考后面的附表。
>: 大端模式
I: unsigned int
4s: 4 个 char
f: float
1.1 方法pack
属性:
format :格式化字符串
size:结构体的大小
方法:
pack(v1,v2, ....)
返回:一个字节流对象
s. pack(v1,v2, ....) : 按照fmt(格式化字符串)的格式,来打包参数v1,v2,....。
s.pack_into(buffer, offset, v1, v2, …) :按照fmt(格式化字符串)的格式,来打包参数v1,v2,....,并将打包的字节从offset(偏移位置)处开始,写入可写缓冲buffer 中。(注意:这里的offset 是必需的参数)
s.unpack_from(buffer,offset=) :按照fmt(格式化字符串)的格式,在offset偏移处开始,从缓冲区解包。其结果是一个元组。缓冲区的大小(以字节为单位,减去偏移量)必需至少为格式所需的大小,如calcsize() 所反映的。
2. 相关实例
这里来写几个常见的实例
2.1 一般情况
代码:
先将数据对象,放到一个元组中,然后创建一个Struct对象,并使用pack()方法打包该元组;然后解包该元组。
# -*- coding: utf-8 -*- """ 打包和解包 """ import struct import binascii values = (1, b'good', 1.22) #查看格式化对照表可知,字符串必须为字节流类型。 s = struct.Struct('I4sf') packed_data = s.pack(*values) unpacked_data = s.unpack(packed_data) print('Original values:', values) print('Format string :', s.format) print('Uses :', s.size, 'bytes') print('Packed Value :', binascii.hexlify(packed_data)) print('Unpacked Type :', type(unpacked_data), ' Value:', unpacked_data)
结果:
Original values: (, b'good', 1.22) Format string : b'I4sf' Uses : bytes Packed Value : b'01000000676f6f64f6289c3f' Unpacked Type : <class 'tuple'> Value: (, b'good', 1.2200000286102295) [Finished in .1s]
参考链接:
https://www.lmlphp.com/user/63990/article/item/721809/
标签:格式化,struct,Python,print,模块,字符串,data,pack From: https://www.cnblogs.com/haoran123/p/17362279.html