跳转到内容

Python/struct

维基教科书,自由的教学读本

有的时候需要用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"))