【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 Web开发库之webargs使用详解

    在现代Web开发中,处理来自客户端的请求参数是一个常见任务。无论是在构建Web API、Web应用程序还是其他Web服务,都需要一种有效的方式来解析、验证和转换这些参数。Python的 Webargs 库是一个功能强大的工具,可以优雅地处理Web请求参数,使开发过程更加简单和可维护。本文

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

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

    2024年01月18日
    浏览(42)
  • Python处理日期和时间库之arrow使用详解

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

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

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

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

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

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

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

    2024年04月17日
    浏览(73)
  • 一文看懂图像格式 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日
    浏览(39)
  • 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日
    浏览(27)
  • Python标准库之os

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

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

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

    2024年04月14日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包