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

python常用内建模块:struct

struct 是 Python 中的一个内建模块,用于处理 C 语言结构体与 Python 数据类型之间的转换。它允许你将 Python 中的数据打包成二进制格式,或者将二进制数据解包成 Python 数据类型。这在处理二进制数据(如网络通信、文件读写等)时非常有用。

基本用法

打包(Packing)

使用 struct.pack 方法将 Python 数据类型转换为二进制数据。struct.pack 的第一个参数是一个格式字符串,用于指定要打包的数据的类型和顺序;后面的参数是要打包的数据。

格式字符串由多个字符组成,每个字符表示一个数据类型。例如:

  • c:字符(1 字节)
  • b:有符号字符(1 字节)
  • B:无符号字符(1 字节)
  • h:短整型(2 字节)
  • H:无符号短整型(2 字节)
  • i:整型(4 字节)
  • I:无符号整型(4 字节)
  • f:浮点型(4 字节)
  • d:双精度浮点型(8 字节)

还有一些用于指定字节顺序和字节大小的修饰符,如:

  • @:原生字节顺序(默认)
  • =:标准字节顺序(默认)
  • <:小端字节顺序(最低有效字节在前)
  • >:大端字节顺序(最高有效字节在前)
  • !:网络字节顺序(大端)
  • s:字符串(前面必须指定长度)
  • p:指针(用于内部表示)
  • x:填充字节(不占用任何存储空间)

示例:

 

python复制代码

import struct
# 将两个整数打包成二进制数据
packed_data = struct.pack('ii', 1, 2)
print(packed_data) # 输出:b'\x01\x00\x00\x00\x02\x00\x00\x00'
解包(Unpacking)

使用 struct.unpack 方法将二进制数据解包成 Python 数据类型。struct.unpack 的第一个参数是格式字符串,后面是要解包的二进制数据(通常是字节对象)。

示例:

 

python复制代码

import struct
# 之前打包的二进制数据
packed_data = b'\x01\x00\x00\x00\x02\x00\x00\x00'
# 解包二进制数据
unpacked_data = struct.unpack('ii', packed_data)
print(unpacked_data) # 输出:(1, 2)
计算大小(Calculating Size)

使用 struct.calcsize 方法可以计算格式字符串指定的数据在内存中的大小(以字节为单位)。

示例:

 

python复制代码

import struct
# 计算两个整型数据在内存中的大小
size = struct.calcsize('ii')
print(size) # 输出:8

示例应用

假设你有一个包含多个整数和浮点数的二进制文件,你可以使用 struct 模块来读取和写入这个文件。

写入二进制文件
 

python复制代码

import struct
# 要写入的数据
data = [(1, 2.5), (3, 4.5), (5, 6.5)]
# 打开文件用于二进制写入
with open('data.bin', 'wb') as f:
for item in data:
# 打包数据并写入文件
packed_item = struct.pack('if', *item)
f.write(packed_item)
读取二进制文件
 

python复制代码

import struct
# 打开文件用于二进制读取
with open('data.bin', 'rb') as f:
# 计算每条记录的大小
record_size = struct.calcsize('if')
# 读取文件中的所有记录
data = []
while True:
# 从文件中读取一条记录
record = f.read(record_size)
if not record:
break
# 解包记录并添加到列表中
unpacked_record = struct.unpack('if', record)
data.append(unpacked_record)
print(data) # 输出:[(1, 2.5), (3, 4.5), (5, 6.5)]

struct 模块非常强大,适用于各种需要处理二进制数据的场景。通过掌握它的用法,你可以更有效地处理网络通信、文件读写等任务。


http://www.kler.cn/a/456952.html

相关文章:

  • Mac 12.1安装tiger-vnc问题-routines:CRYPTO_internal:bad key length
  • 计算机网络 (17)点对点协议PPP
  • 第十六届蓝桥杯模拟赛(第一期)(C语言)
  • Unity SpriteAtlasManager.atlasRequested趟坑
  • 在基于IMX6ULL的Linux嵌入式编程中,与内存相关的堆(Heap)和栈(Stack)有什么区别?Linux 系统中堆和栈的内存布局是怎么样的?
  • 基于西湖大学强化学习课程的笔记
  • React(一)—— router/useRef/useState
  • 地理数据库Telepg面试内容整理-如何解决大规模地理数据导入时出现的性能瓶颈
  • 灾备方案和架构类型、跨区域
  • hive中的四种排序类型
  • SVN和Git
  • Day1 微服务 单体架构、微服务架构、微服务拆分、服务远程调用、服务注册和发现Nacos、OpenFeign
  • 代码解析:安卓VHAL的AIDL参考实现
  • Android 自定义shell命令
  • 4.银河麒麟V10(ARM) 离线安装 MySQL
  • 在线学习平台-项目技术点-前台
  • Mono里运行C#脚本6—mono加载EXE文件和DLL文件保存的HASH表
  • PPO(近端策略优化)算法基本原理
  • 跨境办公的网络如何选择?
  • [Rust开发]actix_webmiddleware 中间件
  • CSS系列(42)-- Backdrop Filter详解
  • 基于深度学习的图像超分辨率重建
  • LeetCode 349. 两个数组的交集 (C++实现)
  • nginx反向代理单台 Web 服务器实验
  • (长期更新)《零基础入门 ArcGIS(ArcMap) 》实验五----土地整治(超超超详细!!!)
  • elasticsearch 杂记