# struct-二进制数据处理
# 概述
struct模块是Python中用于处理二进制数据的模块。它提供了一组用于处理C语言风格的基本数据类型(如整型、浮点型、字符串等)的函数,能够实现二进制数据与Python数据类型之间的相互转换。
struct模块中的函数主要有以下几个:
-
struct.pack(format, v1, v2, ...): 根据给定的格式format将一组值打包成二进制数据,并返回一个包含打包数据的bytes对象。其中,format是一个字符串,用于指定打包的数据类型及其顺序;v1, v2, ...是要打包的数据值。 -
struct.unpack(format, buffer): 根据给定的格式format从二进制数据中解包出一组数据,并返回一个包含解包数据的元组。其中,format和buffer分别表示解包的数据格式和数据源。 -
struct.calcsize(format): 根据给定的格式format计算出打包后的二进制数据的大小(以字节为单位),并返回这个大小。
# format
# 类型
| 字符 | C类型 | Python类型 | 字节数 |
|---|---|---|---|
b | signed char | int | 1 |
B | unsigned char | int | 1 |
h | short | int | 2 |
H | unsigned short | int | 2 |
i | int | int | 4 |
I | unsigned int | int | 4 |
l | long | int | 4 |
L | unsigned long | int | 4 |
q | long long | int | 8 |
Q | unsigned long long | int | 8 |
f | float | float | 4 |
d | double | float | 8 |
# 格式
| 字符 | 格式 |
|---|---|
< | 小端对齐 |
> | 大端对齐 |
# 使用示例
# 1
import struct
# 将一组值打包成二进制数据
data = struct.pack('3s i f', b'abc', 100, 3.14)
# 解包出一组数据
values = struct.unpack('3s i f', data)
# 打印解包后的数据
print(values) # 输出: (b'abc', 100, 3.140000104904175)
在上面的示例中,我们使用pack函数将一个字符串、一个整数和一个浮点数打包成二进制数据,然后使用unpack函数从这个二进制数据中解包出这三个值,并将它们打印出来。
'3s i f'是pack和unpack中的格式字符串,表示打包和解包的数据类型及其顺序。3s表示一个长度为3的字符串,i表示一个整数,f表示一个浮点数。
# 解析pyc文件元数据
def print_metadata(fp):
magic = struct.unpack('<l', fp.read(4))[0]
print(f"magic number = {hex(magic)}")
bit_field = struct.unpack('<l', fp.read(4))[0]
print(f"bit filed = {bit_field}")
t = struct.unpack('<l', fp.read(4))[0]
print(f"time = {time.asctime(time.localtime(t))}")
file_size = struct.unpack('<l', fp.read(4))[0]
print(f"file size = {file_size}")