python——struct模块

在Python和C结构之间转换的函数,用于二进制数据存储和处理,处理c语言中的结构体。

常用函数

常用函数包括如下三个,pack将数据封装成字节流;unpack根据给定格式解析字节,返回tuple类型; calcsize返回给定的格式占用内存的字节数。

struct.pack(fmt, v1, v2, ...) -> bytes
struct.unpack(fmt, buffer) -> (v1, v2, ...)
struct.calcsize(fmt) -> int
格式符(fmt)

格式符用来表示字节封装或解析的格式,注意:

1.每个格式符前可以有一个数字,表示个数,比如4s表示长度为4的字符串,2i表示两个整数;

2.q和Q只在机器支持64位操作时有意义;

3.P用来转换一个指针,其长度和计算机相关;

4.f和d的长度和计算机相关。

格式符C语言类型Python类型内存大小
x填充字节1
ccharstring(长度为1)1
bsigned charint1
Bunsigned charint1
hshortint2
Hunsigned shortint2
iintint4
Iunsigned int/longint/long4
Lunsigned longlong8
qlong longlong8
Qunsigned long longlong8
ffloatfloat4
ddoublefloat8
schar[]string1
pchar[]string1
?_Boolbool1
对齐方式
字符字节顺序大小
@(默认)与本机一致凑够4个字节
=与本机一致按原字节数
<小端按原字节数
>大端按原字节数
!network(大端)按原字节数
示例
pack

*注意:*python3所有字符串都是 unicode 字符串,若直接用pack封装会报如下错误:

#error: argument for 's' must be a bytes object

因此字符串处理前需要使用’utf-8’编码,具体方法如下代码段。

import struct
a=10
b='apple'
c=35.9
d=True
data=struct.pack("i5sf?",a,b.encode('utf-8'),c,d)#对字符串先编码
print(data)
#输出:b'\n\x00\x00\x00apple\x00\x00\x00\x9a\x99\x0fB\x01'
unpack
import struct
t=struct.unpack("i5sf?",data)
#或者:t1,t2,t3,t4=struct.unpack("i5sf?",data)
print(t)
#输出:(10, b'apple', 35.900001525878906, True)
calcsize
import struct
struct.calcsize('5s')
#输出:5
struct.calcsize('3if')
#输出:16
#16=3*4+4
struct.calcsize('i5sf?')
#输出:17
#17=4+5+3+4+1  
'''
注意:其中3表示填充,因为默认对齐方式为@
字节字符串s可以以任何偏移量开头,因为其标准大小为1;
i,f等只能以4的倍数的偏移量开头。例如0、4、8等;
L,d等只能以8的倍数的偏移量开头。例如0、8、16等。
'''
struct.calcsize('=i5sf?')
#输出:14
#14=4+5+4+1  按原字节数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值