Python Struct 模块

2024 年 8 月 29 日 | 5 分钟阅读

在本教程中,我们将学习 Python 的 struct 模块并理解它的功能。

Python 中的 struct 模块提供了用于处理 C 风格数据结构和二进制数据的工具。它用于根据指定的格式将数据打包到二进制表示中或从二进制表示中解包出来。这在处理低级二进制数据格式时尤其有用,例如网络协议、文件格式等所使用的格式。

它提供了创建和解释打包的二进制数据的函数,使我们能够按字节级别工作。它通常在我们需要读取或写入二进制文件、通过网络发送或接收二进制数据或与低级硬件接口交互时使用。

Struct 函数

让我们来理解 struct 模块的函数。

struct.pack() - struct.pack() 函数用于根据指定的格式将值打包到二进制字符串中。当您需要将 Python 数据类型转换为可以写入文件、通过网络发送或用于低级数据操作的二进制表示时,此函数特别有用。

struct.pack() 的语法如下:

语法 -

  • format: 指定打包数据所需二进制布局的格式字符串。
  • v1, v2, ...: 要打包到二进制格式中的值。

让我们理解以下示例 -

示例 -

输出

Packed data: b'*\x00\x00\x00\xcd\xcc\x0c@\x00\x00\x00Hello      '

解释 -

在此输出中,每个值都已根据格式字符串 'i f 10s' 进行打包。

  • '*\x00\x00\x00':打包的整数 42(以小端字节顺序)。
  • \xcd\xcc\x0c@:打包的浮点数 3.14(IEEE 754 单精度格式)。
  • Hello:字符串 'Hello' 的打包字节(用空格填充以满足格式中指定的 10 个字符长度)。
  • 结果是一个字节序列,表示二进制格式的打包数据。

struct.unpack() - struct.unpack() 函数用于根据指定的格式将二进制数据解包到值元组中。它接受一个格式字符串和一个类字节对象(通常从读取二进制文件或类似源获得),并返回一个包含解包值的元组。

语法

  • format - 指定二进制数据格式的字符串。
  • buffer - 包含打包二进制数据的类字节对象。

示例

输出

Unpacked values: (42, 3.140000104904175, b'Hello      ')
In this example:
- `42` is the unpacked integer value.
- `3.140000104904175` is the unpacked floating-point value.
- `b'Hello      '` is the unpacked bytes object representing the string 'Hello'.

struct.unpack() 函数会根据提供的格式解释二进制数据,并返回一个解包值的元组。

struct.calcsize() - struct.calcsize() 函数用于根据给定的格式字符串计算存储打包数据所需的字节大小。它接受一个格式字符串作为参数,并返回按该格式打包数据所需的尺寸。

语法

  • format - 指定二进制数据格式的字符串。

示例 -

输出

Size required: 18 bytes

解释 -

在此示例中,格式字符串 `'i f 10s'` 表示您正在打包一个整数(`i`)、一个浮点数(`f)和一个 10 字节字符串(`10s`)。计算出的 18 字节大小是按照此格式字符串打包数据所需的总大小。

在实际执行打包操作之前,当您需要分配内存或确定打包二进制数据的存储需求时,struct.calcsize() 函数非常有用。

struct.pack_into() - Python 的 **struct** 模块中的 struct.pack_into() 函数用于根据给定的格式字符串将值打包到可变缓冲区中。此函数允许您将数据直接打包到预先分配的缓冲区中,这有助于优化内存使用并减少不必要的内存复制。

语法

  • format - 指定二进制数据格式的字符串。
  • buffer - 一个可写缓冲区类对象(例如 bytearray),打包的数据将被存储在此处。
  • offset - 打包数据应放置在缓冲区中的起始位置。
  • value1, value2, ... - 根据给定格式要打包到缓冲区中的值。

示例

输出

Packed data buffer: bytearray(b'\x00\x00*\x00@33\x0f\xb5\xc3')

解释 -

在此示例中,整数值 `42` 和浮点值 3.14 被打包到 `data_buffer` 字节数组中,从索引 2(偏移量)开始。生成的打包数据存储在指定的缓冲区中,打包后您可以看到缓冲区中更新的值。

请记住,缓冲区必须是可写的,并且足够大以存储打包的数据。此外,指定的偏移量应在缓冲区的有效范围内。

struct.unpack_from() - struct.unpack_from() 用于根据给定的格式字符串,从指定偏移量开始,从缓冲区解包数据。此函数允许您从二进制缓冲区的特定位置提取数据,而无需解包整个缓冲区。

语法

struct.unpack_from(format, buffer, offset=0)

  • format - 指定二进制数据格式的字符串。
  • buffer - 一个可读的缓冲区类对象(例如 bytes、bytearray),将从中解包数据。
  • offset - 应从中开始解包的缓冲区中的起始位置。默认为 0。

示例 -

输出

Unpacked values: (42, 3.140000104904175)

在此示例中,struct.unpack_from() 函数用于从 packed_data 缓冲区中提取一个整数和一个浮点数,从索引 2(偏移量)开始。解包并打印结果值。

指定的偏移量应在缓冲区的有效范围内。此外,用于解包的格式字符串应与打包到缓冲区中的数据所使用的格式匹配。

结论

Python 中的 struct 模块提供了强大的工具,用于以各种格式打包和解包二进制数据。它对于处理需要在不同系统之间交换或写入文件的二进制数据特别有用。该模块允许您指定一个格式字符串,该字符串定义了数据的结构,包括数据类型及其大小。