python3中的struct模块使用
- 2020 年 1 月 10 日
- 筆記
软硬件环境
- python3
- struct
简介
struct是python(包括版本2和3)中的内建模块,它用来在c语言中的结构体与python中的字符串之间进行转换,数据一般来自文件或者网络。
常用方法
struct模块中的函数
函数 |
return |
explain |
---|---|---|
pack(fmt,v1,v2…) |
string |
按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回. |
pack_into(fmt,buffer,offset,v1,v2…) |
None |
按照给定的格式(fmt),将数据转换成字符串(字节流),并将字节流写入以offset开始的buffer中.(buffer为可写的缓冲区,可用array模块) |
unpack(fmt,v1,v2…..) |
tuple |
按照给定的格式(fmt)解析字节流,并返回解析结果 |
pack_from(fmt,buffer,offset) |
tuple |
按照给定的格式(fmt)解析以offset开始的缓冲区,并返回解析结果 |
calcsize(fmt) |
size of fmt |
计算给定的格式(fmt)占用多少字节的内存,注意对齐方式 |
struct.pack(fmt,v1,v2,…)
struct.unpack(fmt,string)
按照给定数据格式解开(通常都是由struct.pack进行打包)数据,返回值是一个tuple
对齐方式
为了同c中的结构体交换数据,还要考虑c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下
Character |
Byte order |
Size |
Alignment |
---|---|---|---|
@(默认) |
本机 |
本机 |
本机,凑够4字节 |
= |
本机 |
标准 |
none,按原字节数 |
< |
小端 |
标准 |
none,按原字节数 |
> |
大端 |
标准 |
none,按原字节数 |
! |
network(大端) |
标准 |
none,按原字节数 |
Format |
C Type |
Python type |
Standard size |
Notes |
---|---|---|---|---|
x |
pad byte |
no value |
|
|
c |
char |
string of length 1 |
1 |
|
b |
signed char |
integer |
1 |
(3) |
B |
unsigned char |
integer |
1 |
(3) |
? |
_Bool |
bool |
1 |
(1) |
h |
short |
integer |
2 |
(3) |
H |
unsigned short |
integer |
2 |
(3) |
i |
int |
integer |
4 |
(3) |
I |
unsigned int |
integer |
4 |
(3) |
l |
long |
integer |
4 |
(3) |
L |
unsigned long |
integer |
4 |
(3) |
q |
long long |
integer |
8 |
(2), (3) |
Q |
unsigned long long |
integer |
8 |
(2), (3) |
f |
float |
float |
4 |
(4) |
d |
double |
float |
8 |
(4) |
s |
char[] |
string |
|
|
p |
char[] |
string |
|
|
P |
void * |
integer |
|
(5), (3) |
实例
理论性的东西看起来都比较枯燥,来个实例代码就容易理解多了。本例来实现往一个2进制文件中按照某种特定格式写入数据,之后再将它读出。相信通过这个理例子,你就能基本掌握struct的使用。
# -*- coding: utf-8 -*- __author__ = 'djstava' ''' 数据格式为 姓名 年龄 性别 职业 lily 18 female teacher ''' import os import struct fp = open('test.bin','wb') # 按照上面的格式将数据写入文件中 # 这里如果string类型的话,在pack函数中就需要encode('utf-8') name = b'lily' age = 18 sex = b'female' job = b'teacher' # int类型占4个字节 fp.write(struct.pack('4si6s7s', name,age,sex,job)) fp.flush() fp.close() # 将文件中写入的数据按照格式读取出来 fd = open('test.bin','rb') # 21 = 4 + 4 + 6 + 7 print(struct.unpack('4si6s7s',fd.read(21))) fd.close()
运行上面的代码,可以看到读出的数据与写入的数据是完全一致的。
/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/djstava/Playground/flaskPy/test.py (b'lily', 18, b'female', b'teacher') Process finished with exit code 0