📅  最后修改于: 2023-12-03 15:34:05.084000             🧑  作者: Mango
Python 中的 struct pack 功能是将给定的数据转换为字符串的一种格式化工具。它能够将 Python 对象编码成二进制数据或者将二进制数据解码成 Python 对象。类似于 C 语言中的格式化输入输出函数,例如 printf 和 scanf。
struct.pack(format, *args)
其中,参数 format 是转换格式字符串,*args 是传入的参数。
| 转换格式字符 | C 语言数据类型 | Python 数据类型 | 字节数 |
| ------ | ------ | ------ | ------ |
| x
| 无效占位符 | 无对应类型 | 1 |
| c
| char | 字符串 | 1 |
| b
| signed char | 整型 | 1 |
| B
| unsigned char | 整型 | 1 |
| ?
| _Bool | 布尔型 | 1 |
| h
| short | 整型 | 2 |
| H
| unsigned short | 整型 | 2 |
| i
| int | 整型 | 4 |
| I
| unsigned int | 整型 | 4 |
| l
| long | 整型 | 4 |
| L
| unsigned long | 整型 | 4 |
| q
| long long | 整型 | 8 |
| Q
| unsigned long long | 整型 | 8 |
| f
| float | 浮点型 | 4 |
| d
| double | 浮点型 | 8 |
| s
| char[] | 字符串 | n |
| p
| char[] | 字符串 | n |
| P
| void * | 整型 | 4 |
其中,字节数默认为 1,可以通过数字前缀指定。
import struct
# 整型转化为二进制
i = 1024
struct.pack('I', i) # b'\x00\x04\x00\x00'
# 多个整型转化为二进制
i1, i2 = 1024, 2048
struct.pack('II', i1, i2) # b'\x00\x04\x00\x00\x00\x08\x00\x00'
# 将多个数据打包到一个字符串中
i, s, f = 1024, 'hello, world', 3.14159
struct.pack('I11s?f', i, s.encode('utf-8'), f) # b'\x00\x04\x00\x00hello, world\x00\x00\x00\x00\x00\x00\x00\x99\x0f\xdb\x0fI'
# 二进制数据解压缩
s = b'\x00\x04\x00\x00hello, world\x00\x00\x00\x00\x00\x00\x00\x99\x0f\xdb\x0fI'
i, s, f = struct.unpack('I11s?f', s)
s = s.decode('utf-8').strip(b'\x00').decode('utf-8')
print(i, s, f) # 1024, 'hello, world', 3.14159
以上是 struct pack 的基本使用示例。需要注意的是,在 Python 中,需要将字符串使用 encode('utf-8') 进行编码,以便与二进制数据进行转换。另外,字符串在转换过程中需要占用与字符串长度相同的字节数,在不足时需要进行填充。