Python 二进制数据处理教程:struct 模块详解
在处理网络协议解析、嵌入式设备通信、二进制文件读取这类场景时,Python 内置的 bytes/bytearray 虽然能存储数据,但直接操作十六进制字符太繁琐。这时候,struct 模块就是你的瑞士军刀——它用人类可读的「格式字符串」,一键完成 Python 原生类型和二进制数据的双向转换。
1. 先搞懂:Python 里的二进制存储
先铺垫基础,Python 里专门存二进制的是两个类型:
bytes:不可变字节序列,用b''字面量创建bytearray:可变字节序列,可修改单个字节
2. struct 模块核心
2.1 两个最常用的函数
不需要记复杂的函数名,核心就两个:
2.2 核心规则:格式字符串
格式字符串是 struct 的「指挥棒」,由可选的字节顺序+对齐方式 + 必选的类型说明符 组成。
字节顺序/对齐字符
强烈建议不要省略这部分!否则会依赖运行平台的原生规则,导致代码在 Windows/macOS/Linux 上表现不同。
常用数据类型说明符
记住这些高频类型,90%的场景都能覆盖:
3. 上手试试:基础实操
3.1 单个整数的打包解包
拿大端序(通用协议/存储)举例子:
3.2 混合多种数据类型
格式字符串可以按顺序拼接多个说明符,对应pack/unpack的多个参数/返回值:
4. 实战练手:解析BMP文件头
光说不练假把式,我们写个小工具读取本地(或模拟的)BMP图片的宽、高、位深!
5. 避坑指南与最佳实践
- 必须指定字节顺序:永远别用默认的
@,否则跨平台必出bug - 处理异常:解包时容易遇到长度不匹配的问题,记得捕获
struct.error - 大数据用memoryview:处理几十MB以上的二进制数据时,用
memoryview切片可以减少内存复制 - 查官方文档:冷门格式(比如Pascal字符串
p)直接翻 Python struct官方文档
6. 还能做什么?
除了解析图片,struct 模块的常用场景还有:
- 解析 TCP/UDP 网络包头(比如 IPv4、DNS)
- 读取/写入 Excel 的旧版二进制格式
- 与 C/C++ 编写的动态库交互(传递二进制数据)
- 控制 Arduino、树莓派等嵌入式设备的通信协议
通过今天的教程,你应该能快速上手 struct 处理常见的二进制数据了!如果遇到更复杂的嵌套结构,可以结合 struct.calcsize (计算格式字符串的字节数)分步解析,或者找现成的第三方库(比如 construct)辅助。

