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'