Python模块之struct

发布时间 2023-04-28 19:35:34作者: 皓然123

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/