惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
罗磊的独立博客
IT之家
IT之家
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
博客园 - Franky
博客园 - 聂微东
博客园_首页
爱范儿
爱范儿
量子位
博客园 - 三生石上(FineUI控件)
G
Google Developers Blog
Martin Fowler
Martin Fowler
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Y
Y Combinator Blog
Vercel News
Vercel News
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
Hugging Face - Blog
Hugging Face - Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
Engineering at Meta
Engineering at Meta

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录
Python struct.unpack 和 struct.pack
Yiwei Zhang · 2023-04-26 · via 又见苍岚

Python struct 模块用于将外部压缩的格式字符串与Python类型值进行转换,用于外部文件,网络数据,或是python 与 c语言程序 间的数据交换。

简介

struct 是 Python 中用于格式转换的工具包,核心方法有 packunpack

struct.pack 将输入的值根据对应的格式进行压缩,并返回对应压缩后的二进制串。

struct.unpack 则是用于将外部压缩的格式字符串进行解压(一般是对 struct.pack 函数压缩的数据进行解压),同时返回结果为一个元组,且解压的数据大小必须满足格式指定的字节数。

函数使用

引入包

1
import struct

函数格式

  • pack
1
struct.pack(format, v1, v2, ...)
format v1, v2, …
format描述需要数据的格式,具体内容见下述format strings 需要进行压缩的值,需要注意的是这些值必须与format的格式相匹配
  • unpack
1
struct.unpack(format, buffer)
format buffer
format描述了解包数据的格式,具体内容见下述 format strings 进行解包的缓冲区数据

Format Strings

format strings 的第一个字符为一个特殊字符,用于表示相关的控制信息,若第一个字符并不为指定表中字符,则取默认值,并将第一个字符按 format character 处理。剩余的字符则对应相应的 format character 表示具体的数据交换格式。其中每个 format character 前面都有一个可选数字用于表示该字符匹配的数量。

第一个字符

format 里的第一个字符用于表示字节顺序、数据读取的大小表示、对齐方式。
其中各个字符代表的含义如下所示:

字符 字节顺序 大小表示 对齐方式
@ 本地[1] 本地 本地
= 本地 标准[2]
< 小端 标准
> 大端 标准
! 网络(总是大端) 标准

如果第一个字符不是这些字符之一,默认为@。并将第一个字符按format character处理。

Format Character

format character 则是接在第一个字符后用于表示数据转换时对应的数据类型,如字符 f 则表示将C语言的float 类型转换为 Python 的 float 类型。同时该字符前可增加一个可选数字用于表示该字符匹配的数量,如 4f 则表示匹配 4 个 float 类型的数据。更多字符表示详见下表。
同时若指定的大小表示类型为标准,则以下表的数据类型大小为准,若指定的大小表示类型为本地,则取本机数据C语言 sizeof 指定的数据类型大小。

字符 C类型 Python类型 标准大小
x 填充字节 无对应值 -[3]
c char 长度为1的bytes 1
b signed char integer 1
B unsigned char integer 1
? _Bool bool 1
h short integer 2
H unsigned char integer 2
i int integer 4
I unsigned int integer 4
l long integer 4
L unsigned long integer 4
q long long integer 8
Q unsigned long long integer 8
n ssize_t integer -[4]
N size_t integer -[4]
e -[5] float 2
f float float 4
d double float 8
s char[] bytes -[6]
p char[] bytes -<span class=“hint–top hint–rounded” aria-label=“该字符表示的为"Pascal字符串”。其第一个字节用于存储该字符串的长度length,在pack函数中使用该字符时,只会压缩后面length-1的字符串,超出部分则截断,短缺部分则用空字节填充。注意因仅有一字节的长度位,该字符串的长度最多为255。">[7]
P void* integer -[8]

示例代码

对相同的数字按 short,int,long,long long 进行压缩和解压

1
2
3
4
5
>>> pack(">hilq", 5, 5, 5, 5)
b'\x00\x05\x00\x00\x00\x05\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x05'
>>> unpack(">hilq", b'\x00\x05\x00\x00\x00\x05\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x05')
(5, 5, 5, 5)

压缩和解压指定长度的数字

1
2
3
4
5
>>> pack(">6h",1 ,2 ,3 ,4 ,5 ,6)
b'\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06'
>>> unpack(">6h", b'\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06')
(1, 2, 3, 4, 5, 6)

采用@按本机4字节进行对齐

1
2
pack("@hi", 5, 5)
b'\x05\x00\x00\x00\x05\x00\x00\x00'

进行字符串的压缩和解压

1
2
3
4
5
>>> pack("@5s", b'12345')
b'12345'
>>> unpack("@5s5s", b'1234567891')
(b'12345', b'67891')

使用x进行字节填充

1
2
3
>>> pack(">h4x",3)
b'\x00\x03\x00\x00\x00\x00'

参考资料

文章链接:
https://www.zywvvd.com/notes/coding/python/python-struct/python-struct/