【Python】Struct 库之 pack 和 unpack 详解

这篇具有很好参考价值的文章主要介绍了【Python】Struct 库之 pack 和 unpack 详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 官网解析

首先是官网对于 packunpackcalcsize 以及 Format Strings 的描述

1.1 pack、unpack、calcsize

python unpack,python,python
struct.pack 返回一个 bytes对象,其中包含根据格式字符串 format 打包的值 v1, v2,…
参数必须与格式所要求的值完全匹配
python unpack,python,python
struct.unpack 根据格式字符串 format 从缓冲区 buffer (假设由pack(format,…)打包)中解包。返回一个元组,即使它只包含一个元素。缓冲区的字节大小必须与格式所需的大小匹配,如 calcsize() 所反映的那样。
python unpack,python,python
struct.calcsize 返回与格式字符串 format 对应的结构体(以及由 pack(format,…)生成的 bytes 对象)的大小。

1.2 Format Strings

这一段在官方的描述中很详细,同时也很长,这里我只放几个重要的地方,剩下的可以自行去官网查阅

python unpack,python,python
格式字符串描述打包和拆包数据时的数据布局。它们由格式字符组成,格式字符指定打包/解包的数据类型。此外,特殊字符控制字节顺序、大小和对齐方式。每个格式字符串由一个可选的前缀字符(描述数据的总体属性)和一个或多个格式字符(描述实际数据值和填充)组成。

1.2.1 字节顺序、大小和对齐方式

python unpack,python,python
默认情况下,C 语言的类型以机器的本机格式和字节顺序表示,并在必要时通过填充字节来正确对齐(根据 C 语言编译器使用的规则)。选择这种行为是为了使打包结构体的字节与相应的 C 语言的结构体的内存布局完全对应。是使用本机字节排序和填充还是标准格式取决于应用程序。格式字符串的第一个字符可以用来指示字节顺序、大小和打包数据的对齐方式,如下表所示:
python unpack,python,python

1.2.2 格式字符

python unpack,python,python
格式字符有以下含义:给定 C 和 Python 值的类型,它们之间的转换应该是显而易见的。Standard size 列是指使用Standard size时,以字节为单位的打包值的大小;也就是说,当格式字符串以 <>!= 开头的时候(详情见上面一个表格的 Size 列)。当使用 native size 时,打包值的大小取决于平台。
python unpack,python,python

2. pack 解析

pack会把给定的数据按照 format string 的方式去打包我们来看看例子

例子 1

from struct import *
print(pack(">bhl", 1, 2, 3))

这里 format string>bhl,其中 > 代表采用大端(高位字节在前)的方式打包, bhl 分别代表采用 signed charshortlong(对于 C 语言)的数据类型来分别打包 123,他们分别占用 1 字节、2 字节和 4 字节,下图是运行的结果。b 开头表示是字节类型,输出的结果和我们分析的结果一致
python unpack,python,python

例子 2

from struct import *
print(pack("<2hl", 1, 2, 3))

这里 format string<2hl,其中 < 代表采用小端(低位字节在前)的方式打包, 2h 代表前面 2 个数据采用 signed short 类型、进一步的,我们可以使用 x+格式字符 来表示,后续 x 个字符都用此格式字符来打包
下图是运行的结果:b 开头表示是字节类型,输出的结果和我们分析的结果一致。
python unpack,python,python

例子 3

注意下面代码的运行结果

from struct import *
print(pack("@3c", b'1', b'2', b'3'))
print(pack("@1s", b'123'))
print(pack("@2s", b'123'))
print(pack("@3s", b'123'))

python unpack,python,python
这一段代码主要是 format string 的不同导致了打包的结果和入参不同,其中 c 是以 char 类型去打包,3c 是代表后续的 3 个参数全部按照 char 去打包,而 s 是以 char[] 类型去打包,而 s 前面的数字则是代表打包多少位

3. unpack 解析

unpack 可以理解为是 pack 的逆向,直接看例子

例子1

from struct import *
print(unpack(">bhl",pack(">bhl", 1, 2, 3)))

将上面第一个例子的输出作为unpack的参数输入,然后按照和打包一样的 format string 去进行解包我们可以得到如下的结果,与我们的输入是一致的。
python unpack,python,python
当然,在很多场景下并不是像这样自己打包数据然后再自己解包,而是需要按照一定的协议去解来自其他地方的字节流,于是可以这样写,在 data 中换成需要解包的数据,然后根据包的协议(字节顺序、大小和对齐方式)来编写解包的 format string文章来源地址https://www.toymoban.com/news/detail-691452.html

from struct import *
data = b'\x01\x00\x02\x00\x00\x00\x03'
print(unpack('>bhl', data))

到了这里,关于【Python】Struct 库之 pack 和 unpack 详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python UI框架库之kivy使用详解

    Python是一种广泛使用的编程语言,而Kivy是一个用于创建跨平台移动应用和多点触控应用的开源Python框架。Kivy的设计目标是提供一种简单而强大的方式来构建富有创意的用户界面和交互体验。本文将详细介绍Kivy的基本概念、核心特性、布局系统、用户界面设计和实际应用场景

    2024年04月16日
    浏览(26)
  • Python处理日期和时间库之arrow使用详解

    日期和时间处理是许多应用程序中的常见任务,但在 Python 中,标准库中的  datetime  模块有时可能会让这些任务变得复杂和繁琐。幸运的是,有一个名为 Arrow 的第三方库,它提供了简化日期和时间处理的功能,使其更加直观和易用。本文将深入探讨 Arrow 库的基本概念、安装

    2024年01月25日
    浏览(28)
  • Python机器学习库之orange3使用详解

    数据科学和机器学习是当今科技领域的重要组成部分,而数据分析和建模通常是其中的关键步骤。Python Orange3 是一个功能强大且易于使用的开源工具,它结合了数据可视化、数据分析和机器学习,为数据科学家和分析师提供了一个全面的平台。本文将深入介绍 Python Orange3,包

    2024年01月24日
    浏览(27)
  • Python 数据可视化库之bokeh使用详解

    数据可视化在数据分析和报告中扮演着关键角色,而Python的Bokeh库为创建交互式、具有吸引力的可视化图表提供了强大的工具。本文将介绍Bokeh的基本概念、安装方法以及详细的示例代码,以帮助大家了解如何使用Bokeh创建出色的数据可视化。 Bokeh是一个Python库,用于创建交互

    2024年01月18日
    浏览(29)
  • PyAudio:Python库之PyAudio详解、安装和使用方法

    PyAudio:Python库之PyAudio详解、安装和使用方法 PyAudio是Python语言的一个开源库,它提供了一个跨平台的方式来录制和播放声音。你可以使用PyAudio库来处理音频数据,进行音频特征提取,并将声音数据与其他Python库集成。本文将为您介绍PyAudio的安装及使用方法。 一、PyAudio的安

    2024年02月09日
    浏览(29)
  • Python 创建 Web 应用程序和用户界面库之flexx使用详解

    Flexx 是一个强大的 Python 库,用于创建交互式的 Web 应用程序和用户界面。它提供了灵活的组件和布局管理器,使开发者可以轻松构建具有丰富交互性和动态性的应用。本文将详细介绍 Flexx 库的特性、用法,并通过丰富的示例代码展示其在实际项目中的应用。 Flexx 是一个基于

    2024年04月17日
    浏览(55)
  • 一文看懂图像格式 RAW、RGB、YUV、Packed/Unpacked、Bayer、MIPI、Planar、Semi-Planar、Interleaved

    目录 一、通用属性 1. Packed/Unpacked 2. 压缩/非压缩 二、RAW 1. Bayer格式 2. 分类 3. MIPI RAW 三、RGB 分类 四、YUV 1. YUV与RGB转换 2. 分类 3. 内存计算 五、压缩格式 有的人,错过了,一生再也找寻不到。 本文详细分析各种图像格式(RAW、RGB、YUV)的分类、内存分布。一篇文章让你看懂

    2024年02月06日
    浏览(27)
  • Python Unpack 处理网络字节流

    python struct 包中有pack和unpack 可以处理与C语言对应的数据,详细参考:https://blog.csdn.net/weiwangchao_/article/details/80395941 如果C/C++/C#端发送网络字节流中包含字符串,Python用unpack解析接收到的网络字节流时,可能会遇到字节对齐的问题。 比如, 下图中msg[4]是从网络中接收到的一个数

    2023年04月08日
    浏览(17)
  • Python标准库之os

    顾名思义,OS表示Operating System,即操作系统。OS标准库是一个操作系统接口模块,提供一些方便使用操作系统相关功能的函数,具体安装位置可通过导入os模块查看 os.__file__ 属性得到。当需要在Python代码中调用OS相关功能实现业务逻辑或者无法直接使用命令行工具时,我们就需

    2024年02月02日
    浏览(39)
  • Python常用OS库之path模块学习

    学习python没有太多捷径,有也只有技巧,更重要的是要多学多练,个人觉得练更重要,读万卷书不如行万里路。编程是一门技能,所以除了看还要多实践,写得多了自然也就有了路。 如果看全部的标准库文档,可以访问这个链接 os --- 多种操作系统接口 — Python 3.12.3 文档 接

    2024年04月14日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包