功能:字节数组与二进制数据的相互转换, 常用以下两个功能
官方:https://docs.python.org/2/library/struct.html#struct.error
功能一:打包
struct.pack(fmt,v1,v2,....)
功能二:解包
struct.unpack(fmt, string)
fmt由符号和字符组成
符号 | 描述 |
@ | native |
= | native |
< | little-endian |
> | big-endian |
! | network=big-endian |
格式 | C类型 | Python类型 | 字节数 |
x | Pad byte | no value | |
c | char | string of length1 | 1 |
b | signed char | integer | 1 |
B | unsigned char | integer | 1 |
? | _Bool | bool | 1 |
h | short | integer | 2 |
H | unsigned short | integer | 2 |
i | int | integer | 4 |
I | unsigned int | integer | 4 |
l | long | integer | 4 |
L | unsigned long | integer | 4 |
q | long long | integer | 8 |
Q | unsigned long long | integer | 8 |
f | float | float | 4 |
d | double | float | 8 |
s | char[] | string | |
p | char[] | string | |
P | void * | integer | |
示例:
import struct
#打包,将整数或二进制数值转换成对应格式的字节数组
print(struct.pack('hhl',1,2,3))
#输出 b'\x01\x00\x02\x00\x03\x00\x00\x00'
#解包,将字节数组转换成整数或二进制对应的数据
print(struct.unpack('hh1',b'\x01\x00\x02\x00\x03\x00\x00\x00'))
#输出 (1, 2, 3)
#计算格式化后字节数组长度
print(struct.calcsize('hhl'))
#输出 8
#末尾补2字节0
print(struct.pack('>llhxx',1,2,3))
#输出 b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'
#高级解包
s = b'\x42\x4d\x38\x8c\x0a\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00\x80\x02\x00\x00\x68\x01\x00\x00\x01\x00\x18\x00'
print(struct.unpack("<ccIIIIIIHH",s))
#输出 (b'B', b'M', 691256, 0, 54, 40, 640, 360, 1, 24)