struct模块主要二进制和结构体之间的互相转化。在业务场景中,socket数据的处理会使用到。纯文本是无法进行传输到,因为不同系统硬件的存储方式是不一样的。这个时候使用struct可以按照某种规则进行pack处理成二进制数据,另一端
接收到时按照约定进行unpack成相应数据。
常用API
函数 |
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)占用多少字节的内存,注意对齐方式 |
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(字节顺序) |
Size |
Alignment |
@(默认) |
本机 |
本机 |
本机,凑够4字节 |
= |
本机 |
标准 |
none,按原字节数 |
< |
小端 |
标准 |
none,按原字节数 |
> |
大端 |
标准 |
none,按原字节数 |
! |
network(大端) |
标准 |
none,按原字节数 |
格式字符
文件格式 |
C 类型 |
Python数据类型 |
Standard size |
注释 |
x |
pad byte |
no value |
|
|
c |
char |
bytes of length 1 |
1 |
|
b |
signed char |
integer |
1 |
(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) |
n |
ssize_t |
integer |
|
(4) |
N |
size_t |
integer |
|
(4) |
e |
(7) |
float |
2 |
(5) |
f |
float |
float |
4 |
(5) |
d |
double |
float |
8 |
(5) |
s |
char[] |
bytes |
|
|
p |
char[] |
bytes |
|
|
P |
void * |
integer |
|
(6) |
实例:
参考