当前位置:首页 > Python > 正文

Python struct库详解(零基础掌握二进制数据处理与字节操作)

在Python编程中,我们经常需要处理来自网络、文件或硬件设备的原始二进制数据。这时候,Python struct库就派上用场了!它提供了一种将Python值(如整数、浮点数、字符串等)与C语言风格的二进制数据结构之间相互转换的方法。

Python struct库详解(零基础掌握二进制数据处理与字节操作) struct库 二进制数据处理 struct模块教程 Python字节操作 第1张

什么是struct模块?

Python的struct模块是标准库的一部分,用于在Python值和C语言中的二进制表示之间进行转换。这种转换常用于:

  • 读写二进制文件(如图像、音频、自定义格式)
  • 网络协议解析(如TCP/UDP数据包)
  • 与C/C++程序交互
  • 嵌入式系统通信

核心函数介绍

struct模块主要有两个核心函数:

  • pack(fmt, v1, v2, ...):将Python值打包成二进制字节串
  • unpack(fmt, buffer):从二进制字节串解包出Python值

格式字符说明

在使用struct时,你需要指定一个“格式字符串”(format string),它告诉模块如何解释数据。常用格式字符如下:

格式字符 C类型 Python类型 字节数
c char bytes(长度为1) 1
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
f float float 4
d double float 8
s char[] bytes 由前缀数字决定

实战示例:打包与解包

示例1:打包一个整数和一个浮点数

import struct# 打包:将整数123和浮点数3.14打包成二进制数据packed_data = struct.pack('if', 123, 3.14)print("打包后的字节串:", packed_data)print("字节长度:", len(packed_data))# 解包:从二进制数据中还原出原始值unpacked_data = struct.unpack('if', packed_data)print("解包后的元组:", unpacked_data)

输出结果:

打包后的字节串: b'{\x00\x00\x00\xcd\xccL@'字节长度: 8解包后的元组: (123, 3.140000104904175)

示例2:处理字符串

注意:字符串在struct中必须是字节类型(bytes),且需指定长度。

import struct# 打包一个5字节的字符串和一个整数name = b"Alice"age = 25packed = struct.pack('5si', name, age)# 解包unpacked_name, unpacked_age = struct.unpack('5si', packed)print("姓名:", unpacked_name.decode('utf-8'))  # 转回字符串print("年龄:", unpacked_age)

字节序问题

不同系统可能使用不同的字节序(大端或小端)。struct默认使用本机字节序,但你可以通过格式字符串前缀显式指定:

  • <:小端(Little-endian)
  • >:大端(Big-endian)
  • !:网络字节序(即大端)
import struct# 小端打包data_le = struct.pack('<H', 0x1234)print("小端:", data_le)  # 输出: b'4\x12'# 大端打包data_be = struct.pack('>H', 0x1234)print("大端:", data_be)  # 输出: b'\x124'

实际应用场景

假设你要读取一个自定义的二进制文件头,包含以下字段:

  • 魔数(4字节字符串):"DATA"
  • 版本号(1字节无符号整数)
  • 数据长度(4字节无符号整数)
import struct# 模拟读取二进制数据header_format = '<4sBI'  # 小端,4字节字符串 + 1字节无符号 + 4字节无符号mock_data = struct.pack(header_format, b'DATA', 1, 1024)# 解析头部magic, version, length = struct.unpack(header_format, mock_data)print(f"魔数: {magic.decode()}")print(f"版本: {version}")print(f"数据长度: {length} 字节")

总结

通过本教程,你已经掌握了Python struct库的基本用法,包括格式字符、打包/解包操作、字节序控制以及实际应用。无论你是处理网络协议、解析二进制文件,还是与硬件通信,struct模块教程都能为你提供强大支持。

记住关键点:

  • 使用正确的格式字符串
  • 注意字节序(尤其在网络通信中)
  • 字符串必须转为bytes类型
  • 理解每个类型对应的字节数

现在,你可以自信地使用Python字节操作来处理各种二进制数据了!如果你正在学习二进制数据处理,struct模块绝对是你的得力助手。