struct模块

struct模块主要二进制和结构体之间的互相转化。在业务场景中,socket数据的处理会使用到。纯文本是无法进行传输到,因为不同系统硬件的存储方式是不一样的。这个时候使用struct可以按照某种规则进行pack处理成二进制数据,另一端
接收到时按照约定进行unpack成相应数据。

常用API

函数returnexplain
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)占用多少字节的内存,注意对齐方式

Hello World

values = (1, b'abc', 2.5)
s = struct.Struct('I3sf') # 声明每个值的类型,I表示整型、3s表示长度为3的字符串、f表示浮点型
packed_data = s.pack(*values)  
print(packed_data)
unpacked_data = s.unpack(packed_data)
print(type(unpacked_data), unpacked_data)

字节顺序,大小,对齐

默认情况下,C语言类型以机器的本地格式和字节顺序表示。

Character(字符)Byte order(字节顺序)SizeAlignment
@(默认)本机本机本机,凑够4字节
=本机标准none,按原字节数
<小端标准none,按原字节数
>大端标准none,按原字节数
!network(大端)标准none,按原字节数

格式字符

文件格式C 类型Python数据类型Standard size注释
xpad byteno value
ccharbytes of length 11
bsigned charinteger1(1),(3)
Bunsigned charinteger1(3)
?_Boolbool1(1)
hshortinteger2(3)
Hunsigned shortinteger2(3)
iintinteger4(3)
Iunsigned intinteger4(3)
llonginteger4(3)
Lunsigned longinteger4(3)
qlong longinteger8(2), (3)
Qunsigned long longinteger8(2), (3)
nssize_tinteger(4)
Nsize_tinteger(4)
e(7)float2(5)
ffloatfloat4(5)
ddoublefloat8(5)
schar[]bytes
pchar[]bytes
Pvoid *integer(6)

实例:

1
2


参考