Python中struct 模块的使用教程

1.struct 简单介绍

struct 是 Python 的内置模块, 在使用 socket 通信的时候, 大多数据的传输都是以二进制流的形式的存在, 而 struct 模块就提供了一种机制, 该机制可以将某些特定的结构体类型打包成二进制流的字符串然后再网络传输,而接收端也应该可以通过某种机制进行解包还原出原始的结构体数据

2.struct 的使用

struct 模块可以将任意大小的数字转换成一个固定长度(可选择)的 bytes, 这个原理类似于前面章节讲过的 hash 算法, 不论内容多大, 最终的 hash 值长度不变, 不同的是 hash 算法是不可逆的, 而且传入的原材料可以是文本、字符串等许多数据类型, struct 可以反解出原来的数据

ps : struct 模块只能转换数字, 不能转换其他的数据类型

3.基本使用 pack 和 unpack

正确使用示例 (打包字节长度对应表请往下看)

import struct

res = struct.pack("i",1234566)  # 传入的必须是 int 类型
print(res)          # b'\x86\xd6\x12\x00'  (查看内容)
print(type(res))    # <class 'bytes'>      (查看类型)

res2 = struct.unpack("i",res)   # 使用什么 Format 打包就用什么解包
print(res2)         # (1234566,)           (是个元组)
print(type(res2))   # <class 'tuple'>      (查看类型)
print(res2[0])      # 1234566         

传入非 int 类型引发的错误示例

import struct

res = struct.pack("i","1231")
# 抛出异常 : struct.error: required argument is not an integer (参数必须是整数)

解包时使用的 Format 不一致错误示例

import struct

res = struct.pack("i",123)

res2 = struct.unpack("q",res)
# struct.error: unpack requires a buffer of 8 bytes

传入多个值

res = struct.pack("hiq",12,23,451312)  # 传入多个值, 并使用不同的 Fromat
print(res)  # b'\x0c\x00\x00\x00\x17\x00\x00\x00\xf0\xe2\x06\x00\x00\x00\x00\x00'
print(type(res))  # <class 'bytes'>

a,b,c = struct.unpack("hiq",res)  # 使用解压赋值,有几个值就需要有几个 Fromat
print(a,b,c)                      # 12 23 451312

Fromat 与值不一致错误示例

with open("aaa.txt","wb")as f:
    for i in range(5):
        res = struct.pack("i",i)
        f.write(res)
        
with open("aaa.txt","rb")as f:
    res = f.read()
    print(res)
    a,b,c,d,e= struct.unpack("i",res)  # 打包的时候是 5 个值, 解包的时候也要传 5 个值
    print(a,b,c,d,e)  # 抛出异常 : struct.error: unpack requires a buffer of 4 bytes

打包一个 json 后的信息长度, 在 socket 中可用于发送报头(报头为固定长度)

import struct
import json

dic = {
    "header_name" : "a.txt",
    "total_size" : 22,
    "heash" : "shawn"
} #Python小白学习交流群:725638078

res = json.dumps(dic)  # 将报头序列化
lens = struct.pack("i",len(res))  # 将报头的长度传入并打包
lens2 = struct.unpack("i",lens)   # 假设通信另一端收到打包的二进制,再进行解包拿到长度
print(lens2)    # (60,)
print(lens[0])  # 60

4.打包字节长度对照表

字符(Format) cType Python type Standard size
x pad byte no value
c char string of length 1 1
b signed char integer 1
B unsigned char integer 1
? _Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I(大写i) unsigned int integer 4
l(小写L) long integer 4
L unsigned long integer 4
q long long integer 8
Q unsigned long long integer 8
f float float 4
d double float 8
s charl string
p charl string
P void* integer

原文链接:https://www.cnblogs.com/djdjdj123/p/17307821.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中struct 模块的使用教程 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • python 实现从高分辨图像上抠取图像块

    Python实现从高分辨图像上抠取图像块的完整攻略包含以下步骤: 1. 安装必要的库 在python中使用Pillow(Python Imaging Library)库来处理图像。可以使用pip命令来安装该库,命令如下: pip install pillow 2. 加载要处理的图像 使用Pillow的Image打开图像,然后转换为numpy数组来处理。示例代…

    python 2023年5月18日
    00
  • python中shell执行知识点

    Python中的subprocess模块可以用于在Python脚本中执行shell命令。使用此模块,我们可以执行已存在的shell命令和脚本,并且获取命令的输出和执行结果。 在Python脚本中执行shell命令,主要通过subprocess模块中的Popen()方法来实现。下面是Popen()方法的基本形式(其中“args”参数是要执行的命令字符串): s…

    python 2023年6月2日
    00
  • Python安装第三方库及常见问题处理方法汇总

    Python安装第三方库及常见问题处理方法汇总 安装第三方库的方式 在Python中安装第三方库有多种方式,下面介绍比较常见的几种: 使用pip安装 pip是Python中最常用的第三方库安装工具,可以通过以下命令安装: pip install 库名 下载源码安装 有些第三方库没有通过pip发布,只能通过官方网站下载源码进行安装。下载后解压缩,进入该目录,执…

    python 2023年5月14日
    00
  • Python实现模拟时钟代码推荐

    下面是关于“Python实现模拟时钟代码推荐”的完整攻略。 简介 在了解具体实现方法之前,首先需要明确实现时钟的基本原理。 模拟时钟的实现方法,一般都是利用计算机系统的计时功能(例如Python中的time模块)来模拟时间的流逝,并不断更新时钟的显示。因此,要实现一个模拟时钟,需要掌握以下几个关键点: 计算机系统计时功能的使用方法 时钟的外观和显示形式设计 …

    python 2023年6月2日
    00
  • python for循环内输出和外输出方式

    我们来详细讲解一下Python中循环的输出方式。一般来说,我们会在循环体内对每一次循环的结果进行输出,也会在循环体外对整个循环的结果进行输出。下面我们将分别对这两种输出方式进行介绍。 循环内输出方式 循环内输出方式指的是,在循环体内对每一个迭代器结果进行输出。Python中常用的循环结构有for循环和while循环。对于for循环,我们通常使用关键字for和…

    python 2023年6月5日
    00
  • Python编程之列表操作实例详解【创建、使用、更新、删除】

    Python编程之列表操作实例详解【创建、使用、更新、删除】 在Python中,列表是一种非常常用的数据类型,用于存储一组有序的元素。列表可以包含不同类型的元素,包括数字、字符串、布尔值等。本文将详细介绍Python中列表的创建、使用、更新和删除操作,包括方法、示例等。 创建列表 创建列表的方法有多种,包括使用方括号[]、使用list()函数、使用列表推导式…

    python 2023年5月13日
    00
  • 解决使用openpyxl时遇到的坑

    下面是一份详细讲解“解决使用openpyxl时遇到的坑”的实例教程。 1. 安装openpyxl模块 在开始使用openpyxl的时候,首先需要安装相应的模块。打开终端,执行以下命令即可完成安装: pip install openpyxl 2. 创建一个Excel文件 使用openpyxl创建新的Excel文件非常简单。以下是一个示例代码,可以创建一个新的工…

    python 2023年5月14日
    00
  • Python3爬虫学习之爬虫利器Beautiful Soup用法分析

    Python3爬虫学习之爬虫利器Beautiful Soup用法分析 介绍 在Python3中,爬虫领域有许多实用的工具,而Beautiful Soup就是其中一款非常常用的解析库。 环境配置 在使用Beautiful Soup之前,需要先安装: pip install beautifulsoup4 基本语法 在使用Beautiful Soup解析网页前,需…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部