【Python-利用动态二维码传输文件(二)】实现文件二进制读取、利用base64编码把文件拆分成多张二维码、重组拆分后的文件并验证。

2023-11-19

         为了使用二维码传输文件,上一篇文章已经实现了获取信息存入二维码并打印。由于单个二维码存储的信息量是有限的,而且文件一般也比较大,所以必须把文件先进行拆分,拆分后一块一块信息存入多张二维码中,最后通过图像识别,把所有二维码信息准确读取后再重新组装成文件。接下来一步一步讨论如何用Python实现文件拆分、打印二维码、识别二维码、重组文件四个过程


目录

一、把文件拆分成块

二、把字节列表打印成多个二维码图片

三、利用OpenCV识别二维码图片并重组文件信息


一、把文件拆分成块

        首先读取文件,然后进行拆分。由于传输的文件格式多样,为了可以打开不同的文件格式,采用二进制方式读取文件是最通用的,通过以下Python代码可以实现文件的二进制读取,并一次文件读取所有内容。

        其中pic001.png是csdn图标的截图,如下图,大小为2.74KB。

        主要代码如下,mode='rb'设置了文件以二进制模式打开,read()方法一次性读取所有内容,若文件太大需要分段读取以免爆内存。

import os

# 使用二进制模式读取pic001.png图片
_file = open("pic001.png", mode="rb")
# 一次性读取所有字节(若文件太大请分段读取避免爆内存)
_contents = _file.read()

        接着是拆分文件,这里需要特别注意的是由于后续文件需要通过二维码传输,若直接使用原编码进行传输,编码不一定能使用明文查看,导致程序调试不方便,因此这里先把读取出来的文件数据转换成base64编码再进行拆分和传输,对base64有兴趣的可以阅读以下文章一篇文章彻底弄懂Base64编码原理https://blog.csdn.net/wo541075754/article/details/81734770

        主要代码如下,contents_base64=base64.b64encode(_contents),将_contents转换为base64编码,split_file()函数按固定长度拆分base64格式的字节流,其中_base64_str为字节流,_len为拆分的固定长度,最后返回拆分的字节列表_base64_str_list

import base64

# 转换为_base64格式方面传输数据
contents_base64 = base64.b64encode(_contents)
print("拆分前编码:"+contents_base64.decode('utf-8'))
# 调用拆分函数
_temp_list = split_file(contents_base64,128)

# 按固定长度拆分_base64格式的字节流,_base64_str为字节流,_len为拆分的固定长度
def split_file(_base64_str,_len):
    _base64_str_list = [_base64_str[i:i + _len] for i in range(0, len(_base64_str), _len)]
    return _base64_str_list

        输出结果如下,我们看到了熟悉的 AASUVORK5CYII=结尾的数据和列表。

拆分前编码:
iVBORw0KGgoAAAANSUhEUgAAAGkAAAApCAYAAAA22gdWAAAA(省略.....)gezoj6RGbYQAAAAASUVORK5CYII=
拆分后字节列表: [b'iVBORw0KGgoAAAANSUhEUgAAAGkAAAApCAYAAAA22gdWAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAApNSURBVHhe7Znn',(省略.....)
b'xCG5mMOUJ++Psr+8SCQHKkx5wv4M+0uLRL7/J6Y8SX+uSfA/gezoj6RGbYQAAAAASUVORK5CYII=']

二、把字节列表打印成多个二维码图片

        文件拆分成字节列表后,下一步就是把每个列表的值存入二维码并打印了,这里直接用上一篇文章的打印二维码代码就可以了,代码如下。

import os
import qrcode

# 根据拆分后的字节流列表_base64_str_list,在cache文件夹下生成对应的二维码图片
def print_qr(_base64_str_list):
    # 删除原来cache文件夹内的文件
    for _pic_file in os.listdir("cache"):
        os.remove("cache/"+_pic_file)
    # 是否存在cache这个文件夹
    if not os.path.exists("cache"):
        os.makedirs("cache")
    # 循环生成二维码图片
    for i in range(0,len(_base64_str_list)):
        qr = qrcode.QRCode()
        qr.add_data(_base64_str_list[i], 0)
        img = qr.make_image()
        img.save("cache/split_file_00"+str(i)+".png")

        这里需要注意的是,每次生成二维码图片前需要先清空cache文件夹原有的内容,cache文件夹是专门用来存放生成的二维码图片的,如果不提前清空,可能会残留上一次生成二维码图片的数据,导致后续合成文件出错。删除文件夹内文件这里用到了os.listder("cache")函数,用于返回cache下的文件列表,然后使用os.remove("cache/"+_pic_file)删除文件夹下的文件。

        删除干净以后,循环调用qr.add_data()添加二维码信息,qr.make_image()img.save()保存二维码图片到cache文件夹下面。最后看到cache文件夹下面出现了29张二维码图片,命名规则为split_file_00x,如下图:

 三、利用OpenCV识别二维码图片并重组文件信息

        到目前为止文件已经拆分成29张二维码图片了,现在需要做的是重新识别二维码,并重组文件。这里利用OpenCV的库cv2和库pyzbar完成识别,代码如下。

import cv2
from pyzbar import pyzbar

# 识别拆分后二维码还原并验证
def verify_qr():
    _temp_str = ""
    for i in range(0, len(os.listdir("cache"))):
        # 读取二维码图片
        qrcode = cv2.imread("cache/split_file_00"+str(i)+".png")
        # 解析二维码中的数据
        data = pyzbar.decode(qrcode)
        # 在数据中解析出二维码的data信息
        _temp_str = _temp_str + data[0].data.decode('utf-8')
    return _temp_str

        这里需要注意的是 如果使用os.listder("cache")函数返回二维码文件列表,列表不一定按文件名顺序返回(还没搞懂),所以只能使"cache/split_file_00"+str(i)+".png"文件名自增循环一个一个读,避免读取顺序出错。读取结果如下:

拆分前编码:
iVBORw0KGgoAAAANSUhEUgAAAGkAAAApCAYAAAA22gdWAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAkkJ
(省略......)
3OY8iR+a9OJxCG5mMOUJ++Psr+8SCQHKkx5wv4M+0uLRL7/J6Y8SX+uSfA/gezoj6RGbYQAAAAASUVORK5CYII=

还原后编码:
iVBORw0KGgoAAAANSUhEUgAAAGkAAAApCAYAAAA22gdWAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAkkJ
(省略......)
3OY8iR+a9OJxCG5mMOUJ++Psr+8SCQHKkx5wv4M+0uLRL7/J6Y8SX+uSfA/gezoj6RGbYQAAAAASUVORK5CYII=

        可以看到,拆分前和识别还原后结果是一致的,证明文件信息已经正确重组了。以下是完整的代码。

import base64
import os
import cv2
from pyzbar import pyzbar
import qrcode


# 按固定长度拆分_base64格式的字节流,_base64_str为字节流,_len为拆分的固定长度
def split_file(_base64_str,_len):
    _base64_str_list = [_base64_str[i:i + _len] for i in range(0, len(_base64_str), _len)]
    return _base64_str_list


# 根据拆分后的字节流列表_base64_str_list,在cache文件夹下生成对应的二维码图片
def print_qr(_base64_str_list):
    # 删除原来cache文件夹内的文件
    for _pic_file in os.listdir("cache"):
        os.remove("cache/"+_pic_file)
    # 是否存在cache这个文件夹
    if not os.path.exists("cache"):
        os.makedirs("cache")
    # 循环生成二维码图片
    for i in range(0,len(_base64_str_list)):
        qr = qrcode.QRCode()
        qr.add_data(_base64_str_list[i], 0)
        img = qr.make_image()
        img.save("cache/split_file_00"+str(i)+".png")

# 识别拆分后二维码还原并验证
def verify_qr():
    _temp_str = ""
    for i in range(0, len(os.listdir("cache"))):
        # 读取二维码图片
        qrcode = cv2.imread("cache/split_file_00"+str(i)+".png")
        # 解析二维码中的数据
        data = pyzbar.decode(qrcode)
        # 在数据中解析出二维码的data信息
        _temp_str = _temp_str + data[0].data.decode('utf-8')
    return _temp_str


if __name__ == '__main__':
    # 使用二进制模式读取pic001.png图片
    _file = open("pic001.png", mode="rb")
    # 一次性读取所有字节(若文件太大请分段读取避免爆内存)
    _contents = _file.read()
    # 转换为_base64格式方面传输数据
    contents_base64 = base64.b64encode(_contents)
    print("拆分前编码:"+contents_base64.decode('utf-8'))
    # 调用拆分函数
    _temp_list = split_file(contents_base64,128)
    print("拆分后字节列表:",_temp_list)
    # 调用二维码生成函数
    print_qr(_temp_list)
    # 逐个识别所有生成的二维码,重新组合数据,验证是否正确
    print("还原后编码:"+verify_qr())

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python-利用动态二维码传输文件(二)】实现文件二进制读取、利用base64编码把文件拆分成多张二维码、重组拆分后的文件并验证。 的相关文章

随机推荐

  • 老胡的周刊(第106期)

    老胡的信息周刊 1 记录这周我看到的有价值的信息 主要针对计算机领域 内容主题极大程度被我个人喜好主导 这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享 项目 quivr 2 Quivr 是您在云中的第二个大脑 让您轻松存储和检
  • windows10-cuda10.1-cudnn7-tensorflow1.4.0配置流程

    1 下载cuda版本 cuda 10 1 105 win10 network exe 并按照流程安装 安装完后 打开cmd 输入 nvcc V 回车查看是否有版本信息 若出现版本信息 则证明nvcc安装成功 2 下载cudnn版本 cudn
  • oracle批量绑定 forall bulk collect用法以及测试案例

    一 如何使用批挷定提高性能 How Do Bulk Binds Improve Performance 在PL SQL 和SQL引擎 engines 中 太多的上下文切换 context switches 会影响性能 这个会发生在当一个循环
  • 黑丝YYDS,通过五十行代码分分钟下载上万张黑丝小姐姐纯欲高清图!(宅男福利)

    前言 夏天已经接近尾声了 虽然各种大白腿会少了很多 但是会冒出很多各种黑色的大长腿哇 尤其是黑色的 黑丝才是永远滴神 今天带你们大饱眼福一波 一 技术路线 requests 网页请求 BeautifulSoup 解析html网页 re 正则
  • c3p0 mysql 自动重连_关于C3P0容错和自动重连特性的研究

    转载 http blog csdn net cutesource article details 5422093 最近常有数据库和网络设备升级和搬迁等事情 而各个应用都是基于数据库连接池做的 大部分都是基于C3P0 数据库或网络状况的变动都
  • FreeBSD开启SSH远程登录

    1 安装时选择上 SSH 或者源码安装 SSH 2 使用 root 登陆系统 3 使用 ee 编辑器编辑 ee etc inetd conf 去掉 ssh 前的 按 ctrl c 再输入 exit 保存退出 4 编辑 ee etc rc c
  • unity零基础学习

    提示 本人作为萌新记录unity学习路线 后期会根据学习情况不断进行修改 自学途径主要依赖siki学院 前言 伴随游戏行业的兴起 unity引擎的使用越来越普遍 本文章主要记录博主本人入门unity的相关记录大部分依赖siki学院进行整理
  • 【入门指南】从Python入门人工智能指南

    作为一个学习者 什么样的学习方式 学习路径能够帮助我们更高效 便捷的入门人工智能 不至于错过奔驰而过的 AI 号列车 人工智能时代持续发展 成为新一轮产业变革的核心驱动力和引领未来发展的战略技术 不仅受到政策的支持 国内人工智能市场规模也在
  • 在VS Code中使用Kotlin

    在VS Code中使用Kotlin 当前Google有意用Kotlin来替代Java 今后在Android开发中 可能Kotlin会成为标准语言 Kotlin语言是由JetBrains公司开发的 就是做IntelliJ IDEA的那家公司
  • Python示例,它演示了如何使用Python中的类和继承来创建一个简单的形状类层次结构:

    定义一个形状类 class Shape def area self pass 定义一个矩形类 继承自形状类 class Rectangle Shape def init self width height self width width
  • Pycharm 安装插件

    Pycharm 安装插件 Pycharm 安装插件 Pycharm 中一些值得安装的插件 Rainbow Brackets IdeaVim Markdown Navigator Translation 如果说编辑器是程序员的武器 那么插件就
  • Notion笔记搭建博客网站 - NotionNext

    NotionNext是什么 NotionNext是我在Github上开源的基于Next js框架开发的博客生成器 目的是帮助写作爱好者们通过Notion笔记快速搭建一个独立站 从而专注于写作 而不需要操心网站的维护 它将您的Notion笔记
  • 多线程系列之——事件内核对象

    所有内核对象里面事件内核对象是最简单的一个 它包括一个使用计数 还有两个布尔值 一个布尔值用来表示事件是手动重置事件还是自动重置事件 另一个布尔值表示当前是否处于触发状态 当一个手动重置事件被触发的时候 所有等待该事件的线程都能变成调度状态
  • -day14--模块与内置模块

    day14 模块 课程目标 掌握Python中常用模块的使用方法 今日概要 自定义模块 包 第三方模块 内置模块 1 2 1 自定义模块 1 1 模块和包 import hashlib def encrypt data 数据加密 hash
  • 【全站首发】最详细的jetbrains space使用方法

    目录 一 注册一个Jetbrains账号 如果有可以跳过 二 创建或加入一个space团队 包含下载软件 三 Jetbrains Space软件配置 四 软件的使用 一 注册一个Jetbrains账号 如果有可以跳过 打开Jetbrains
  • 测试工作总结

    1 软件测试定义 2 基本方法 3 流程规范 1 新需求 需求文档 原型图 蓝湖 文档分析 评审 测试计划 测试用例编写 冒烟测试用例编写 计划用例评审 跟项目组 项目组提交测试 程序员自测报告 验证自测报告 跟公司而定 有的是冒烟测试 开
  • 在 IBM Bluemix 开发及使用 Docker Images

    Node Js是云端平台开发App的主要工具 以下范例是将Bluehatter App以3中方式执行包含 1 以Node Js在localhost开发Bluehatter App后直接Deloy至IBM Bluemix云端平台执行 2 将前
  • yolov5量化部署(基于openvino和tensorrt)

    yolov5 openvino量化部署 首先 下载YOLOv5源码 安装YOLOv5和OpenVINO的python依赖 git clone https github com ultralytics yolov5 git pip insta
  • 常用的vue指令语法用法

    一 v text 相当于js的innerText 二 v bind 动态绑定属性 简写是冒号 三 v on 绑定事件 简写是 用于事件的绑定类似于js的onclick 四 v model 可以用 v model 指令在表单
  • 【Python-利用动态二维码传输文件(二)】实现文件二进制读取、利用base64编码把文件拆分成多张二维码、重组拆分后的文件并验证。

    为了使用二维码传输文件 上一篇文章已经实现了获取信息存入二维码并打印 由于单个二维码存储的信息量是有限的 而且文件一般也比较大 所以必须把文件先进行拆分 拆分后一块一块信息存入多张二维码中 最后通过图像识别 把所有二维码信息准确读取后再重新