当前位置: 首页 > news >正文

【后端】struct.pack()

struct.pack() 是 Python 标准库 struct 提供的一个函数,用于将Python中的数据类型(如 int、float)打包成二进制格式(bytes,通常用于网络发送、文件写入、底层通信等。


🧠 一句话理解:

struct.pack('格式字符串', 值1, 值2, ...)
就是把多个值打包成一个 bytes 对象,打包方式由“格式字符串”决定。


🧩 常见格式字符对照表:

格式符意义(类型)占字节数是否符号示例最大值
Bunsigned char(无符号 8 位)1 字节无符号255
bsigned char(有符号 8 位)1 字节有符号-128~127
Hunsigned short(无符号 16 位)2 字节无符号65535
hsigned short(有符号 16 位)2 字节有符号-32768~32767
Iunsigned int(无符号 32 位)4 字节无符号4294967295
isigned int(有符号 32 位)4 字节有符号-2^31 ~ 2^31-1
Qunsigned long long(无符号 64 位)8 字节无符号2^64-1
qsigned long long(有符号 64 位)8 字节有符号-2^63 ~ 2^63-1
ffloat(32 位)4 字节有符号IEEE-754
ddouble(64 位)8 字节有符号IEEE-754

📐 字节序(Endian)前缀说明:

前缀符号含义举例
>大端(高字节在前)>I 表示大端 uint32
<小端(低字节在前)<H 表示小端 uint16
!网络字节序(大端)!I 相当于 >I
@按平台本地字节序和对齐方式不建议用于协议数据
=按平台字节序但不对齐跨平台通信不推荐

✅ 示例讲解:

import struct# 1. 小端无符号 32 位整数(4 字节)打包
b1 = struct.pack('<I', 12345678)  # 返回 b'\x4e\x61\xbc\x00'# 2. 大端无符号 64 位整数(8 字节)打包
b2 = struct.pack('>Q', 0x5e5e5e5e5e5e5e5e)  # 帧头# 3. 多个字段一起打包:大端帧头 + 小端4个uint32
packed = struct.pack('>QIIII', 0x5e5e5e5e5e5e5e5e, 1000, 2000, 30, 40)

🛠️ 解包(对应 struct.unpack()

data = b'\x01\x00\x00\x00'  # 小端 1
value = struct.unpack('<I', data)[0]  # => 1

🔁 常见通信例子

frame = struct.pack('>Q', 0x1234567890abcdef)  # 大端帧头
frame += struct.pack('<I', 1000)  # 小端频点
frame += struct.pack('<I', 2000)  # 小端频点

✅ 总结背口诀:

  • I 就是 4 字节无符号整型(uint32)

  • Q 就是 8 字节无符号整型(uint64)

  • H 是 2 字节无符号整型(uint16)

  • < 是小端,加 > 是大端

  • pack → Python → bytes,unpack → bytes → Python

http://www.dtcms.com/a/326380.html

相关文章:

  • 【昇腾】Atlas 500 A2智能小站M.2 SATA盘启动Ubuntu22.04系统CPU占用过高问题处理_20250811
  • Qt-信号和槽
  • Android16新特性速记
  • Python day 41
  • [langchian]使用langchain构建一个chatbot
  • JS深拷贝 浅拷贝、CSS垂直水平居中
  • CRM(客户关系管理)框架详解
  • 【09-神经网络介绍2】
  • 快速了解TF-IDF算法
  • 高精度蓝牙定位:技术、应用与未来发展
  • AI Copilot
  • istio如何采集method、url指标
  • Linux系统编程Day12 -- 环境变量(初识)
  • [特殊字符][特殊字符][特殊字符]【Maven】pom依赖的版本推荐与依赖冲突问题
  • C#使用EPPlus读写Excel
  • 定制化4G专网架构,满足多行业专属需求
  • 在线代码比对工具
  • HTML5中华美食网站源码
  • 布控球:临时布防场景的高清回传利器-伟博
  • 双椒派™ E2000D 开发板深度解析
  • 【Altium designer】一键添加多个器件参数的“备注”
  • conda一键配置python开发环境
  • echarts 柱状图堆叠踩坑指南 (已解决)
  • 读《精益数据分析》:媒体内容平台全链路梳理
  • 超算中心的机器上怎么部署Linux的?
  • 3.6 修改vuex的状态Mutations ,Actions
  • Tricentis Tosca:现代软件测试的自动化利器
  • Java 包装类简单认识泛型
  • Mysql——单表最多数据量多少需要分表
  • Redis 01 数据结构