struct模块:解决str和其他二进制数据类型的转换
介绍
struct 的相关函数
exception struct.error
异常struct.pack(format, v1, v2, ...)
返回一个 bytes 对象- 根据格式字符串
format
打包值 v1, v2, ...
- 参数个数必须与格式字符串所要求的值完全匹配
struct.pack_into(format, buffer, offset, v1, v2, ...)
- 根据格式字符串
format
打包 v1, v2, ...
等值 - 将打包的字节串写入可写缓冲区
buffer
从 offset
开始的位置,offset
是必需的参数
struct.unpack(format, buffer)
- 根据格式字符串
format
从缓冲区 buffer
解包(假定是由 pack(format, …) 打包) - 结果为一个元组,即使其只包含一个条目
- 缓冲区的字节大小必须匹配格式所要求的大小,如
calcsize()
所示
struct.unpack_from(format, /, buffer, offset=0)
- 对 buffer 从位置 offset 开始根据格式字符串 format 进行解包
- 结果为一个元组,即使其中只包含一个条目
- 缓冲区的字节大小从位置
offset
开始必须至少为 calcsize()
显示的格式所要求的大小
struct.iter_unpack(format, buffer)
struct.calcsize(format)
- 返回与格式字符串
format
相对应的结构的大小(即 pack(format, ...)
所产生的字节串对象的大小)
字节顺序
格式字符
格式 | C 类型 | Python 类型 | 标准大小 | 备注 |
---|
x | 填充字节 | 无 | (7) | |
c | char | 长度为 1 的字节串 | 1 | |
b | signed char | 整数 | 1 | (1), (2) |
B | unsigned char | 整数 | 1 | (2) |
? | _Bool | bool | 1 | (1) |
h | short | 整数 | 2 | (2) |
H | unsigned short | 整数 | 2 | (2) |
i | int | 整数 | 4 | (2) |
I | unsigned int | 整数 | 4 | (2) |
l | long | 整数 | 4 | (2) |
L | unsigned long | 整数 | 4 | (2) |
q | long long | 整数 | 8 | (2) |
Q | unsigned long long | 整数 | 8 | (2) |
n | ssize_t | 整数 | (3) | |
N | size_t | 整数 | (3) | |
e | (6) | float | 2 | (4) |
f | float | float | 4 | (4) |
d | double | float | 8 | (4) |
s | char[] | 字节串 | (9) | |
p | char[] | 字节串 | (8) | |
P | void* | 整数 | (5) | |
示例
import struct
num1 = 12345
num2 = 123
num3 = 1
# 把任意长度的整数转换成4个字节:2**32次方
l1 = struct.pack('i', num1)
l2 = struct.pack('i', num2)
l3 = struct.pack('i', num3)
print(len(l1), l1) # 4 b'90\x00\x00'
print(len(l2), l2) # 4 b'{\x00\x00\x00'
print(len(l3), l3) # 4 b'\x01\x00\x00\x00'
unum1 = struct.unpack('i', l1)
unum2 = struct.unpack('i', l2)
unum3 = struct.unpack('i', l3)
# 返回元组,要取第0个元素
print(unum1[0]) # 12345
print(unum2[0]) # 123
print(unum3[0]) # 1
from struct import *
pack(">bhl", 1, 2, 3) # b'\x01\x00\x02\x00\x00\x00\x03'
unpack('>bhl', b'\x01\x00\x02\x00\x00\x00\x03') # (1, 2, 3)
calcsize('>bhl') # 7
pack("@3s", b'123') # b'123'
pack("@ccc", b'1', b'2', b'3') # b'123'