Python 的 struct 模块是一个用于处理二进制数据的内置模块。它主要用于在 Python 的值(如整数、浮点数、字符串)和 C 语言风格的结构体(即字节流 bytes)之间进行转换。这在处理网络通信协议、解析二进制文件(如图片头信息、WAV 音频文件)或与 C 语言程序交换数据时非常有用。
介绍
struct 的相关函数
exception struct.error异常struct.pack(format, v1, v2, ...)返回一个 bytes 对象- 根据格式字符串
format打包值v1, v2, ... - 参数个数必须与格式字符串所要求的值完全匹配
- 根据格式字符串
struct.pack_into(format, buffer, offset, v1, v2, ...)- 根据格式字符串
format打包v1, v2, ...等值 - 将打包的字节串写入可写缓冲区
buffer从offset开始的位置,offset是必需的参数
- 根据格式字符串
struct.unpack(format, buffer)- 根据格式字符串
format从缓冲区buffer解包(假定是由 pack(format, …) 打包) - 结果为一个元组,即使其只包含一个条目
- 缓冲区的字节大小必须匹配格式所要求的大小,如
calcsize()所示
- 根据格式字符串
struct.unpack_from(format, /, buffer, offset=0)- 对 buffer 从位置 offset 开始根据格式字符串 format 进行解包
- 结果为一个元组,即使其中只包含一个条目
- 缓冲区的字节大小从位置
offset开始必须至少为calcsize()显示的格式所要求的大小
struct.iter_unpack(format, buffer)struct.calcsize(format)- 返回与格式字符串
format相对应的结构的大小(即pack(format, ...)所产生的字节串对象的大小)
- 返回与格式字符串
字节顺序
格式字符
| 格式 | C 类型 | Python 类型 | 标准大小 | 备注 |
|---|---|---|---|---|
| x | 填充字节 | 无 | (7) | |
| c | char | 长度为 1 的字节串 | 1 | |
| b | signed char | 整数 | 1 | (1), (2) |
| B | unsigned char | 整数 | 1 | (2) |
| ? | _Bool | bool | 1 | (1) |
| h | short | 整数 | 2 | (2) |
| H | unsigned short | 整数 | 2 | (2) |
| i | int | 整数 | 4 | (2) |
| I | unsigned int | 整数 | 4 | (2) |
| l | long | 整数 | 4 | (2) |
| L | unsigned long | 整数 | 4 | (2) |
| q | long long | 整数 | 8 | (2) |
| Q | unsigned long long | 整数 | 8 | (2) |
| n | ssize_t | 整数 | (3) | |
| N | size_t | 整数 | (3) | |
| e | (6) | float | 2 | (4) |
| f | float | float | 4 | (4) |
| d | double | float | 8 | (4) |
| s | char[] | 字节串 | (9) | |
| p | char[] | 字节串 | (8) | |
| P | void* | 整数 | (5) |
示例
- 简单示例
import struct
num1 = 12345
num2 = 123
num3 = 1
# 把任意长度的整数转换成4个字节:2**32次方
l1 = struct.pack('i', num1)
l2 = struct.pack('i', num2)
l3 = struct.pack('i', num3)
print(len(l1), l1) # 4 b'90\x00\x00'
print(len(l2), l2) # 4 b'{\x00\x00\x00'
print(len(l3), l3) # 4 b'\x01\x00\x00\x00'
unum1 = struct.unpack('i', l1)
unum2 = struct.unpack('i', l2)
unum3 = struct.unpack('i', l3)
# 返回元组,要取第0个元素
print(unum1[0]) # 12345
print(unum2[0]) # 123
print(unum3[0]) # 1
- 格式化
from struct import *
pack(">bhl", 1, 2, 3) # b'\x01\x00\x02\x00\x00\x00\x03'
unpack('>bhl', b'\x01\x00\x02\x00\x00\x00\x03') # (1, 2, 3)
calcsize('>bhl') # 7
pack("@3s", b'123') # b'123'
pack("@ccc", b'1', b'2', b'3') # b'123'