Python学习之路 —— struct模块使用

用途

  1. 按照指定格式将 Python 数据类型转换为字节流;
  2. 按照指定格式将字节流转换为 Python 数据类型;
  3. 解析 C 语言中的结构体;

内置函数

函数返回值功能
pack(fmt, *args)string按照指定格式(fmt),将数据(*args)转换成字节流,返回字节流
pack_into(fmt, buffer, offset, *args)None按照给定的格式(fmt),将数据(*args)转换成字节流,并将字节流写入以 offset (起始位)开始的 buffer
unpack(fmt, string)tuple按照给定的格式(fmt)解析字节流(string),并返回解析结果
unpack_from(fmt, buffer, offset=0)tuple按照给定的格式(fmt)解析以 offset (起始位置) 开始的缓冲区(buffer),并返回解析结果
calcsize(fmt)int计算给定的格式(fmt)占用内存大小

格式化字符串

字节对齐

由于 C语言 在不同硬件设备上采用的对齐方式不同,因此我们在解析数据流时要考虑字节对齐的问题:

CharacterByte orderSizeAlignment
@(默认)本机本机本机,凑够4字节
=本机标准none,按原字节数
<小端标准none,按原字节数
>大端标准none,按原字节数
!network(大端)标准none,按原字节数

类型转换

格式符C语言类型Python类型Standard size
xpad byte(填充字节)no value
ccharstring of length 11
bsigned charinteger1
Bunsigned charinteger1
?_Boolbool1
hshortinteger2
Hunsigned shortinteger2
iintinteger4
I(大写的i)unsigned intinteger4
l(小写的L)longinteger4
Lunsigned longlong4
qlong longlong8
Qunsigned long longlong8
ffloatfloat4
ddoublefloat8
schar[]string
pchar[]string
Pvoid *long

例程

从字节流解析数据

struct data
{
    char name[20];
    float capacity;
    float Electricity;
    int status;
};
struct demo data{'Hello', 1.2, 1.2, 1};

// 将结构体转换为字节流的结果为:b'Hello\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x99\x99\x9a?\x99\x99\x9a\x00\x00\x00\x01'
import struct

data = b'Hello\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x99\x99\x9a?\x99\x99\x9a\x00\x00\x00\x01'
data = struct.unpack('<20sid', data)  # data为 C程序传递来的字节流
print(data)
# (b'Hello\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 1.2000000476837158, 1.2000000476837158, 1)

数据封装为字节流

import struct

data = struct.pack('>20sffi', 'Hell'.encode('ascii'), 1.2, 1.2, 1)
print(data)
# b'Hello\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x99\x99\x9a?\x99\x99\x9a\x00\x00\x00\x01'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值