Python/struct
< Python
有的时候需要用Python处理二进制数据,比如,存取文件、socket操作。可以使用Python的struct
模块来完成。
struct
模块中最重要的三个函数是pack()
, unpack()
, calcsize()
:
pack(fmt, v1, v2, ...)
按照给定的格式(fmt
),把数据封装成字符串(实际上是类似于c结构体的字节流)unpack(fmt, string)
按照给定的格式(fmt
)解析字节流string
,返回解析出来的tuple
calcsize(fmt)
计算给定的格式(fmt
)占用多少字节的内存
格式描述
编辑struct
中支持的格式如下表:
Format | C 语言数据类型 | Python | 字节数 |
---|---|---|---|
x |
pad byte |
no value |
1 |
c |
char |
string of length 1 |
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 / long |
4 |
l |
long |
integer |
4 |
L |
unsigned long |
long |
4 |
q |
long long |
long |
8 |
Q |
unsigned long long |
long |
8 |
f |
float |
float |
4 |
d |
double |
float |
8 |
s |
char[] |
string |
1(表示一定长度的字符串,4s表示长度为4的字符串) |
p |
char[] |
string |
1 (表示的是pascal字符串) |
P |
void * |
long |
和机器字长相关 |
每个格式前可以有一个数字,表示个数。
可以用格式中的第一个字符来改变对齐方式.定义如下:
字符 | 字节顺序 | 字节数和对齐方式 |
---|---|---|
@ |
native | native 凑够4个字节 |
= |
native | standard 按原字节数 |
< |
little-endian | standard 按原字节数 |
> |
big-endian | standard 按原字节数 |
! |
network (= big-endian) | standard 按原字节数 |
例子
编辑import struct
# 定义数据
a = b"hello"
b = b"world!"
c = 20
d = 42.56
# 打包
binStr = struct.pack("5s6sif", a, b, c, d)
print (len(binStr))
binStr2 = struct.pack("i", c)
# 解包
e, f, g, h = struct.unpack("5s6sif", binStr)
print (e, f, g, h )
# 注意unpack返回的是tuple,如果不按规定格式书写,则返回值将改变类型
i, = struct.unpack("i", binStr2)
print (i)
i = struct.unpack("i", binStr2)
print (i)
# 计算转换字节长度
print (struct.calcsize("5s6sif"))