Python struct 模块详解

在 Python 中,struct 模块是用于处理二进制数据的强大工具。它允许我们根据特定的格式化字符串来解析和生成不同类型的二进制数据。在本文中,我们将详细介绍 struct 模块的功能和使用方法。

安装 struct 模块

struct 模块是 Python 的内置模块,所以无需安装,可以直接导入使用。

import struct

格式化字符串

在 struct 模块中,我们使用格式化字符串来指定预期的二进制数据结构。格式化字符串由格式指令和格式字符组成。下面是一些常用的格式字符:

  • b: 有符号字节
  • B: 无符号字节
  • h: 有符号短整型
  • H: 无符号短整型
  • i: 有符号整型
  • I: 无符号整型
  • f: 单精度浮点数
  • d: 双精度浮点数

格式指令用于指定字节顺序和对齐方式。下面是一些常用的格式指令:

  • <: 低字节序
  • >: 高字节序
  • !: 网络字节序(大端字节序)

解析二进制数据

使用 struct 模块解析二进制数据的基本步骤如下:

  1. 定义格式化字符串,指定要解析的二进制数据结构。
  2. 使用 struct.unpack() 函数解析二进制数据。

下面是一个示例,解析一个包含有符号整型和单精度浮点数的二进制数据:

import struct

# 定义格式化字符串
format_str = '<i f'

# 要解析的二进制数据
binary_data = b'\x01\x00\x00\x00\xcd\xcc\x8c\x3f'

# 解析二进制数据
result = struct.unpack(format_str, binary_data)
print(result)  # 输出:(1, 1.100000023841858)

在上面的代码中,<i f 是我们定义的格式化字符串,指定了一个有符号整型和一个单精度浮点数。b'\x01\x00\x00\x00\xcd\xcc\x8c\x3f' 是要解析的二进制数据,它由 8 个字节组成。最后,我们使用 struct.unpack() 函数解析二进制数据,并打印出结果。

生成二进制数据

使用 struct 模块生成二进制数据的基本步骤如下:

  1. 定义格式化字符串,指定要生成的二进制数据结构。
  2. 使用 struct.pack() 函数生成二进制数据。

下面是一个示例,生成一个包含有符号整型和单精度浮点数的二进制数据:

import struct

# 定义格式化字符串
format_str = '<i f'

# 要生成的数据
data = (1, 1.1)

# 生成二进制数据
binary_data = struct.pack(format_str, *data)
print(binary_data)  # 输出:b'\x01\x00\x00\x00\xcd\xcc\x8c\x3f'

在上面的代码中,<i f 是我们定义的格式化字符串,指定了一个有符号整型和一个单精度浮点数。(1, 1.1) 是要生成的数据。最后,我们使用 struct.pack() 函数生成二进制数据,并打印出结果。

字节顺序和对齐方式

在格式化字符串中,可以使用格式指令来指定字节顺序和对齐方式。字节顺序可以是低字节序(<)或高字节序(>),对齐方式可以是本地对齐(默认)或强制对齐。

下面是一个示例,演示如何使用字节顺序和对齐方式:

import struct

# 定义格式化字符串
format_str = '>i f'

# 要解析的二进制数据
binary_data = b'\x00\x00\x00\x01\x3f\x8c\xcc\xcd