[Python] struct.unpack() 用法详解 - 指南

news/2025/10/6 18:48:24/文章来源:https://www.cnblogs.com/wzzkaifa/p/19127800

struct.unpack()用法详解


struct.unpack() 是 Python 中用于将二进制数据(字节序列)解析为 Python 数据类型的函数,通常与 struct.pack() 配对使用。它根据指定的格式字符串(format string)解析字节流,并返回一个包含解析结果的元组。


一、函数语法

struct.unpack(format
, buffer
)
  • format:格式字符串,定义数据的解析规则(字节顺序、数据类型、数量等)。
  • buffer:包含二进制数据的缓冲区(如 bytesbytearray 或支持缓冲协议的对象)。

返回值:包含解析后数据的元组。


二、格式字符串详解

格式字符串由两部分组成:

  1. 字节顺序/对齐字符(可选):

    字符含义大小端
    @本地顺序(默认)系统依赖
    =本地标准大小系统依赖
    <小端(Little-Endian)低位在前
    >大端(Big-Endian)高位在前
    !网络顺序(大端)RFC 标准
  2. 数据类型字符(必选):

    字符C 类型Python 类型字节数
    x填充字节跳过字节1
    ccharbytes (长度1)1
    bsigned charint1
    Bunsigned charint1
    ?_Boolbool1
    hshortint2
    Hunsigned shortint2
    iintint4
    Iunsigned intint4
    llongint4
    Lunsigned longint4
    qlong longint8
    Qunsigned long longint8
    ffloatfloat4
    ddoublefloat8
    schar[]bytes长度见下文
    pPascal 字符串bytes1+长度
    Pvoid*int系统依赖

    特殊用法


三、使用示例

示例 1:解析整数和浮点数
import struct
# 二进制数据:小端顺序 (<) + int (i) + float (f)
buffer = b'\x01\x00\x00\x00\xcd\xcc\x8c@'
data = struct.unpack('<if'
, buffer
) # 解析1个int和1个float
print(data) # 输出: (1, 7.000000476837158)
示例 2:解析字符串
# 数据:大端 (>) + 4字节字符串 (4s)
buffer = b'ABCD'
data = struct.unpack('>4s'
, buffer
)
print(data) # 输出: (b'ABCD',)
示例 3:解析混合类型
# 数据:小端 (<) + short (h) + 3字节字符串 (3s) + float (f)
buffer = b'\x01\x00XYZ\x00\x00\x80?'
data = struct.unpack('<h3sf'
, buffer
)
print(data) # 输出: (1, b'XYZ', 1.0)
示例 4:跳过填充字节
# 格式: 小端 (<) + char (c) + 填充1字节 (x) + int (i)
buffer = b'A\x00\x02\x00\x00\x00'
data = struct.unpack('<cx i'
, buffer
)
print(data) # 输出: (b'A', 2)
示例 5:解析数组
# 解析3个连续的 unsigned short (H)
buffer = b'\x01\x00\x02\x00\x03\x00'
data = struct.unpack('<3H'
, buffer
)
print(data) # 输出: (1, 2, 3)

四、关键注意事项

  1. 缓冲区长度必须匹配
    使用 struct.calcsize(format) 验证格式字符串所需的字节数:

    fmt = '<2i f'
    buffer = b'\x00' * struct.calcsize(fmt) # 创建匹配长度的缓冲区
  2. 字节顺序至关重要
    大端/小端错误会导致解析数值异常:

    # 错误示例:大端数据用小端解析
    buffer = b'\x00\x00\x00\x01' # 大端表示的整数 1
    struct.unpack('<I'
    , buffer
    ) # 错误!解析为 16777216 (0x01000000)
  3. 字符串处理
    s 类型返回 bytes 对象,需用 .decode() 转为字符串:

    data = struct.unpack('5s'
    , b'Hello'
    )[0]
    print(data.decode('utf-8'
    )
    ) # 输出: 'Hello'
  4. 内存对齐问题
    默认格式 @ 会按本地对齐方式插入填充字节。使用 = 或标准顺序(</>)避免对齐。


五、常见错误

通过合理设计格式字符串,struct.unpack() 可高效处理二进制协议(如网络数据、文件格式)。


研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/929601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件工程第一次随笔 - Nicholas

软件工程第一次作业 基本信息项目 内容这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineerin这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/homew…

终于知道酷睿Ultra X什么意思了!满血12核心核显

终于知道酷睿Ultra X什么意思了!满血12核心核显Posted on 2025-10-06 18:40 lzhdim 阅读(0) 评论(0) 收藏 举报根据最新说法,酷睿Ultra X系列其实代表12个Xe3架构核心的满血核显,而且只有酷睿Ultra X9、酷睿Ul…

上海明鹏建设集团有限公司网站中国建设很行河北省分行合作网站

文章目录 序言1. 样本不均衡2. 样本不均衡的影响以及样本均衡的意义3. 什么时候需要进行样本均衡/数据均衡4. 数据不均衡的解决办法 序言 数据集制作过程中需要关注样本均衡问题&#xff0c;学习笔记&#xff0c;简单记录 1. 样本不均衡 分类任务中不同类别样本数差别很大的…

南阳专业网站设计公司公司网站的后台

XSS(Cross Site Scripting,跨站脚本漏洞)漏洞&#xff0c;又叫 CSS 漏洞&#xff0c;是最常见的 Web 应用程序漏洞。其主要原理是当动态页面中插入的内容含有特殊字符(如<)时&#xff0c;用户浏览器会将其误认为是插入了HTML 标签&#xff0c;当这些HTML标签引入了一段 Java…

网站有收录没权重开发平台app

在Stable Diffusion ComfyUI中&#xff0c;有一种高级技巧可以让用户通过细致的区域化提示词来控制图像的不同部分&#xff0c;从而实现多图连接的效果。这种方法允许艺术家在同一画布上展现多个场景&#xff0c;创造出富有层次和故事性的图像。以下是实现这一效果的详细步骤。…

大连网站优化技术西宁电商网站建设

#include<stdio.h> #include<stdlib.h> int main() {int *p;pmalloc(8);*p1;*p2;p--;printf("%d %d\n",*p,*p);return 0; }

做网站东莞做网站要学

目录 命名空间(Namespace)命令计算资源配额创建命名空间绑定一个ResourceQuota资源将命名空间和资源限制对象进行绑定尝试创建第二个 Pod查看ResourceQuota 绑定第二个ResourceQuota为命名空间配置默认的 CPU 、memory请求和限制&#xff08;1&#xff09;Pod 中所有容器都没有…

网站的联网信息怎么填做骗子曝光网站是否违法

在外贸行业中&#xff0c;客户关系管理尤为关键。在当下的大数据背景下&#xff0c;所有规模的外贸公司都迫切地需要进行数字化改造。无论是大型公司还是小型业务&#xff0c;他们都希望通过深入分析客户数据&#xff0c;为用户提供更优的体验&#xff0c;并据此调整企业战略。…

网站开发json解析企业主页的特点

本地安全策略 Windows 本地安全策略是一组在本地计算机上配置的安全设置&#xff0c;用于管理计算机的安全性和访问控制。这些策略是针对单个计算机的&#xff0c;与域策略不同&#xff0c;本地安全策略不通过域控制器进行集中管理。本地安全策略通过本地组策略编辑器进行配置…

青海农业网站建设公司多语种网站建设方案

0 引言 国内外有关 &#xff36;&#xff32;&#xff30;&#xff33;&#xff30;&#xff24;的文献较多&#xff0c;求解目标多以最小化车辆行驶距离为主&#xff0c;但现实中可能存在由租赁费用产生的单次派出成本&#xff0c;需要综合考 虑单次派车成本和配送路径成本。…

制作网站费用wordpress htaccess文件

动态规划&#xff08;英语&#xff1a;Dynamic programming&#xff0c;简称 DP&#xff09;是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的&#xff0c;把原问题分解为相对简单的子问题 动态规划常常适用于有重叠子问题和最优子结构性质的问题&#xff0c;…

招商加盟网站的图应该怎么做网站收缩广告

大模型LORA微调总结 大模型微调总结模型加载使用deepspeed不使用deepspeed使用lora加载分词器 数据加载构建source和target构建input_ids和labels标签补齐构建训练器LORA模型推理模型加载多batch推理构建lora微调推理合并模型权重 大模型微调总结 模型加载 使用deepspeed mod…

营销单页网站制作建设 互动 网站 模式

看起来你正在使用教程&#xff0c;但是你发布的内容并不完整&#xff0c;这使得你很难看到你的案例发生了什么。在我会仔细检查你的密码。如果看起来正确&#xff0c;请检查日志输出。在日志应该如下所示&#xff1a;[ ... Scrapy log here ... ]2016-09-19 12:09:27 [scrapy.c…

UV使用

安装UV 已有python环境,直接通过pip安装: pip install uv或者通过命令来运行: # windows环境,在powershell窗口执行: powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex&…

自己做的网站被举报违反广告法潍坊定制网站搭建

介绍多态性是为不同的基础形式(例如&#xff0c;数据类型或类)利用同一接口的能力。这允许函数在不同时间使用不同类型的实体。对于Python中的面向对象编程&#xff0c;这意味着可以用与属于特定类的特定对象相同的方式来使用它&#xff0c;就好像它是属于不同类的不同对象一样…

卖家如何做阿里巴巴国际网站设计logo网站免费南蒲四特

1.1 工作中心的定义 工作中心是用于生产产品的生产资源&#xff0c;包括机器、人和设备&#xff0c;是各种生产或能力加工单元的总称。工作中心属于能力的范畴即计划的范畴&#xff0c;而不属于固定资产或者设备管理的范畴。一个工作中心可以是一台设备、一组功能相同的…

CT5120 Intro to Natural Lang. Processing Lab # 4. Text Classification

CT5120 Intro to Natural Lang. Processing Lab # 4. Text Classification# 4. Text Classification## 4.0 Learning Objectives * Conduct exploratory data analysis (EDA)* Preprocess text* Feature extraction* T…

合肥光束网站建设网站页面架构怎么写

目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量&#xff08;解析法&#xff09; 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…

西安网站建设设计的好公司排名做网站的收钱不管了

文章目录 Lookup Join(维表 Join) Lookup Join(维表 Join) Lookup Join 定义(支持 Batch\Streaming):Lookup Join 其实就是维表 Join,比如拿离线数仓来说,常常会有用户画像,设备画像等数据,而对应到实时数仓场景中,这种实时获取外部缓存的 Join 就叫做维表 Join。…

自建网站需要哪些技术网站空间容量

C Primer&#xff08;第5版&#xff09; 练习 10.24 练习 10.24 给定一个string&#xff0c;使用bind和check_size在一个int的vector中查找第一个大于string长度的值。。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*****…