python struct.pack 和struct.upack
时间: 2025-07-24 18:17:13 浏览: 12
### struct.pack 和 struct.unpack 的使用方法及区别
`struct.pack` 和 `struct.unpack` 是 Python `struct` 模块中的两个核心函数,它们分别用于将 Python 数据类型与二进制数据之间进行转换。两者之间的功能是互逆的,适用于底层数据处理、网络通信和文件格式解析等场景。
#### struct.pack 的使用方法
`struct.pack(fmt, v1, v2, ...)` 函数用于将给定的变量按照指定的格式 `fmt` 打包成二进制数据(字节串)。格式字符串 `fmt` 包含格式字符和可选的字节顺序、大小和对齐方式的标识符。例如,`'h'` 表示短整型(2字节),`'i'` 表示整型(4字节),`'B'` 表示无符号字节(1字节)等。格式字符串前可以包含一个字节顺序标识符,如 `'>'` 表示大端模式,`'<'` 表示小端模式。
示例代码如下:
```python
import struct
# 使用大端模式打包两个整数和两个字节
data = struct.pack(">iiBB", 20, 400, 0x0D, 0x0A)
print(data) # 输出: b'\x00\x00\x00\x14\x00\x00\x01\x90\r\n'
```
#### struct.unpack 的使用方法
`struct.unpack(fmt, string)` 函数用于将二进制数据按照指定的格式 `fmt` 解包为 Python 数据类型。该函数返回一个元组,其中包含解包后的数据。格式字符串 `fmt` 必须与打包时使用的格式一致,否则可能导致解包错误或数据不一致。
示例代码如下:
```python
import struct
# 解包之前打包的数据
unpacked_data = struct.unpack(">iiBB", data)
print(unpacked_data) # 输出: (20, 400, 13, 10)
```
#### struct.pack 和 struct.unpack 的区别
`struct.pack` 和 `struct.unpack` 的主要区别在于它们的功能方向不同。`struct.pack` 将 Python 数据转换为二进制数据,而 `struct.unpack` 则将二进制数据还原为 Python 数据。它们通常用于处理需要精确控制字节顺序和大小的场景,例如网络协议数据的编码和解码。
此外,`struct.pack` 和 `struct.unpack` 与字符串的 `encode` 和 `decode` 方法不同。后者用于在文本数据和字节流之间进行转换,而前者用于在二进制数据和 Python 数据类型之间进行转换。这种区别使得 `struct` 模块更适合处理结构化的二进制数据,如 C 语言中的结构体。
#### 格式字符串的规则
格式字符串由格式字符、数量前缀和字节顺序标识符组成。格式字符定义了数据类型,如 `'i'` 表示整型,`'s'` 表示字符串,`'B'` 表示无符号字节等。数量前缀表示重复的次数,例如 `'4s'` 表示长度为 4 的字符串。字节顺序标识符定义了数据的存储方式,如 `'>'` 表示大端模式,`'<'` 表示小端模式。
#### 注意事项
- 格式字符串中的每个格式字符对应一个数据项,数据项的数量必须与格式字符串中定义的数量一致。
- 如果格式字符串中包含字符串类型(如 `'s'`),则需要确保字符串的长度与格式字符串中指定的长度一致。
- `struct.pack` 和 `struct.unpack` 支持的数据类型有限,主要适用于数值类型和固定长度的字符串。
- 字节顺序标识符可以改变数据的存储方式,但默认情况下,`struct` 模块根据本地机器的字节顺序进行转换。
---
### 示例代码
```python
import struct
# 打包数据
data = struct.pack(">iiBB", 20, 400, 0x0D, 0x0A)
print(data) # 输出: b'\x00\x00\x00\x14\x00\x00\x01\x90\r\n'
# 解包数据
unpacked_data = struct.unpack(">iiBB", data)
print(unpacked_data) # 输出: (20, 400, 13, 10)
```
---
### 相关问题
1. 如何使用 struct 模块处理 C 语言结构体?
2. 如何在 Python 中使用 struct 模块解析网络协议数据?
3. struct.pack 和 struct.unpack 如何处理浮点数?
4. 如何使用 struct 模块处理变长字符串?
阅读全文
相关推荐












