Base64编码与解码 ——Python实现

2023-11-11

1. 引言

记录学习base64编码与解码的思考以及通过Python实现。

2. Base64简介

这里请参考文章:一文彻底看懂Base64原理
声明: 本文的图片均来自上述文章。
我的理解就是,将待编码字符集合与二进制{0, 1}之间相互的等价转换情况。
注意:base64是一种可以算是公开的加密方法 ,只能加密保护某些数据。

3. 预习知识

本小节主要介绍字节、二进制、ASCII码等知识,如果很熟悉可以跳过。

3.1 字节

数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。
8bit(位)=1Byte(字节)

3.2 二进制 与字节

因为计算机通信和存储的时候都bai是以010101这样的二进制数据为基础du的,这儿的一个0和1占的地方就叫bit(位),即一个二进制位。

3.3 ASCII码

ASCII码中:一个英文字母(不bai分大小写)占一个字节的空间,du一个中文汉字占两个字节的空间。
ASCII码对照表:ASCII码对照表

3. Base64编码

这里着重讲我自己的理解思路 ,原理还是参考文章开头提到的链接。
本文用的字符集

base64_charset = string.ascii_uppercase + string.ascii_lowercase + string.digits + '+/'

编码过程如下:

3.1 个人理解

  1. 将三个字节(字符)作为一组,也就转换成3✖️8 = 24 bit,如果不足三个字节(24bit),则补0。
  2. 再将上边的24bit转换成四组,即每组6bit。
  3. 将第二步得到的四组数据高位补0,实现完整的4个字节,即4✖️8 = 32 bit,每个字节表示base64的字符集索引。
  4. 将每个扩展后的新的8bit用作表示整数的索引,对应字符集的一个字符,这就是编码后的值。
  5. 最后处理在步骤1中不足3字节的情况 ,缺一个字节索引,即为0时候,补一个=,缺两个就补两个=。
    注意: 高位补0,可以让原数不变,是高位。

3.2 代码实现

str的相关用法

def encode(origin_str):

    # 将字符串转化为字节
    origin_bytes = str(origin_str).encode()

    # 将每一位bytes转换为二进制字符串,高位补0,这里涉及str的format用法
    # 可以百度,也可以参考https://blog.csdn.net/qq_42009978/article/details/107739538
    str_bytes = ['{:0>8}'.format(str(bin(b)).replace('0b', '')) for b in origin_bytes]

    resp = ''
    # 3个一组,整除3,看总共有多少组
    group_nums = len(str_bytes) // 3
    # 看余数剩几个字符
    remain_str_nums = len(str_bytes) % 3

    integral_part = str_bytes[0: 3 * group_nums]
    while integral_part:
        # 取三个字节,以每6比特,转换为4个整数
        tmp_bytes = ''.join(integral_part[0:3])
        tmp_bytes = [int(tmp_bytes[x: x + 6], 2) for x in [0, 6, 12,  18]]
        # 取对应base64字符
        resp += ''.join([base64_charset[i] for i in tmp_bytes])
        integral_part = integral_part[3:]

    if remain_str_nums:
        # 补齐三个字节,每个字节补充 00000000
        remain_part = ''.join(str_bytes[3 * group_nums:]) + (3 - remain_str_nums) * '0' * 8
        tmp_bytes = [int(remain_part[x: x + 6], 2) for x in [0, 6, 12, 18]][: remain_str_nums + 1]  # 这里是对数组进行截取,为了防止产生不必要的数据
        # 剩余1字节可构造2个base64字符,补充==;剩余2字节可构造3个base64字符,补充=
        resp += ''.join([base64_charset[i] for i in tmp_bytes]) + (3 - remain_str_nums) * '='

    return resp

4. Base64解码

解码的过程实际上是编码的一个逆过程,理解了编码,解码也就对应二声了。

4.1 个人理解

  1. 判定给出的字符串是不是一个合法的经过Base64编码的字符串。
  2. 对每一个base64字符取下标索引,并转换为6位二进制字符串。
  3. 取4个6位base64字符,作为3个字节。
  4. 最后将不足四个的base64字符,进行其他处理。

4.2 代码实现

# 判定是否合法
def isValidBase64_str(base64_str):
    if len(base64_str) % 4:
        return False
    for b in base64_str:
        if b not in base64_charset and b is not '=':
            return False
    return True

def decode(base64_str, isFormat = '0'):

    if not isValidBase64_str(base64_str):
        return bytearray

    # 对每一个base64字符取下标索引,并转换为6位二进制字符串
    base64_bytes = ['{:0>6}'.format(str(bin(base64_charset.index(s))).replace('0b', '')) for s in base64_str if
                    s != '=']

    resp = bytearray()

    group_nums = len(base64_bytes) // 4

    remain_str_nums = len(base64_bytes) % 4

    integral_part = base64_bytes[0: 4 * group_nums]
    while integral_part:
        # 取4个6位base64字符,作为3个字节
        tmp_str = ''.join(integral_part[0: 4])
        tmp_str = [int(tmp_str[x: x + 8], 2) for x in [0, 8, 16]]

        for i in tmp_str:
            resp.append(i)

        integral_part = integral_part[4: ]

    if remain_str_nums:
        remain_part = ''.join(base64_bytes[group_nums * 4:])
        tmp_str = [int(remain_part[i * 8: (i + 1) * 8], 2) for i in range(remain_str_nums - 1)]

        for i in tmp_str:
            resp.append(i)

    output_str = resp.decode()

    if isFormat == '1':
        # 相应的处理
        print(isFormat)

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

Base64编码与解码 ——Python实现 的相关文章

  • 最全地理数据下载网址

    晓码创作 整理不易 转载引用请写明出处 一 国内 常见遥感影像下载网址 https mp weixin qq com s xzNGmz1fgb3IqbOV EN1Aw 1 http data cma cn site index html 中
  • Modbus驱动库—libmodbus驱动库的使用

    文章目录 为什么要使用驱动库 libmodbus简介 libmodbus常用函数 Windows平台libmodbus 使用 1 获取源代码 2 生成config h配置文件 3 编写测试代码 4 编译测试代码 Linux平台下libmod
  • C语言循环链表实现约瑟夫环问题

    问题描述 约瑟夫环问题 1 问题描述 设有编号为1 2 n的n n 0 个人围成一个圈 每个人持有一个密码m 从第一个人开始报数 报到m时停止报数 报m的人出圈 再从他的下一个人起重新报数 报到m时停止报数 报m的出圈 如此下去 直到所有人
  • 轻松入门自然语言处理系列 14 Linear-CRF模型

    文章目录 前言 一 Log Linear模型与逻辑回归 1 Log Linear模型 2 从Log Linear模型到逻辑回归 二 Linear CRF模型Inference 1 Linear CRF模型定义 2 Linear CRF模型I
  • 2021年安全员-A证免费试题及安全员-A证考试技巧

    题库来源 安全生产模拟考试一点通公众号小程序 安全员 A证免费试题考前必练 安全生产模拟考试一点通每个月更新安全员 A证考试技巧题目及答案 多做几遍 其实通过安全员 A证很简单 1 判断题 生产经营规模较小的 可以不建立应急救援组织 但应当
  • Each module has to have a unique path

    在android工作中从仓库中down下来的时候 首次运行出现 Each module has to have a unique path 使用android studio开发工具 因为同事一起把 iml文件给上传上去了 每次builde都
  • RISC-V MCU开发 (七):代码调试

    RISC V MCU开发 七 代码调试 MounRiver Studio MRS 配合GD Link WCH Link JLink等在线调试下载器 可支持GDVFx系列 CH56x CH57x CH58x CH32Fx CH32Vx等RIS
  • ‘入门级’程序员面试关键字眼解答

    JSP 全名为 Java Server Pages 中文名叫java服务器页面 其根本是一个简化的Servlet 设计 它是在传统的网页HTML文件 中插入Java程序段 Scriptlet 和JSP标记 tag 从而形成JSP文件 后缀名
  • LaTeX/Markdown中如何在字母上下方插入字母数字

    1 一般的写法 P Y c k X x frac P Y c k prod j P X j x j Y c k sum k P Y c k prod j P X j x j Y c k 效果展示为 P Y
  • 【QT学习教程2】文件操作功能实现

    目录 0 前言 一 界面布局 二 文件操作功能的实现 2 1 思路整理 2 2 初始化界面功能的实现 2 3 判断当前文本是否可以 修改 的功能实现 2 4 新建文本功能的实现 2 5 保存功能的实现 2 6 另存为功能的实现 2 7 文件
  • 使用多线程或异步技术提高图片抓取效率

    导语 图片抓取是爬虫技术中常见的需求 但是图片抓取的效率受到很多因素的影响 比如网速 网站反爬机制 图片数量和大小等 本文将介绍如何使用多线程或异步技术来提高图片抓取的效率 以及如何使用爬虫代理IP来避免被网站封禁 概述 多线程和异步技术都
  • STM32与物联网02-网络数据收发

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • Android Bundle类

    今天发现自己连Bundle类都没有搞清楚 于是花时间研究了一下 根据google官方的文档 http developer android com reference android os Bundle html Bundle类是一个key
  • 蓝桥杯Python常用基础知识

    转化整数 a int x 把a变为函数 a lambda x x 2 a 2 以空格结尾 for i in range 10 range 0 10 if i 2 i 2 0 print i end print print n 把字符串的内容
  • mvn deploy部署报错

    问题描述 使用idea侧边栏进行公司项目的部署 双击即可部署到nexus 但是使用命令mvn clean mvn deploy部署则报错 查看maven状态 配置好maven环境变量 使用命令mvn v 查看版本信息 其中会显示图片如下 这
  • UnityAnimator游戏运行后动画不播放

    问题 动画预览正常 运行后观察Animator正常执行动画 但是场景中没有播放动画 解决方法 将Animator的CullingMode改为AlwaysAnimate
  • C++基础(10)——函数模板和类模板

    前言 本文主要介绍了C 中函数模板和类模板基本知识 6 1 函数模板 模板函数的定义 template
  • JavaWeb.购物车项目

    前言 本章纯代码 后期会修改 一 数据库代码 用户表 create table shop user id number primary key account varchar2 30 not null password varchar2 3
  • leetcode刷题:数组的最大子序和

    题目 动态规划 分析 上面的图是老的数组 下面的是新的数组 通过老数组的当前值加上前一个值对应位置的新数组的值 就是新数组对应位置的新值 最后找到新的队列元素中的最大值即可 代码如下 include

随机推荐

  • MyBatis实现多表查询

    前言 以下学习内容所需数据表 一 关联查询 一 手动处理映射关系 在数据查询后映射到实体类中时 如果映射的属性名和数据表的字段名不一致时 就会返回null 解决办法是使用resultMap进行配置 手动处理数据库查询字段和封装实体类属性之间
  • 详解数据库的自然连接

    首先来看自然连接的定义 自然连接 是一种特殊的等值连接 它要求两个关系进行比较的分量必须是相同的属性组 并且在结果集中将重复属性列去掉 一个简单的例子 将下列关系R和S进行自然连接 R A B C a b c b a d c d e d f
  • patroni+etcd+antdb高可用

    patroni etcd antdb高可用架构图 Patroni组件功能 自动创建并管理主备流复制集群 并且通过api接口往dcs Distributed Configuration Store 通常指etcd zookeeper cons
  • Android—WebView简单使用

    华清创客学院 2016 12 12 08 49 有时候我们可能会碰到一些比较特殊的需求 比如说要求在应用程序里展示一些网页 相信每个人都知道 加载和显示网页通常都是浏览器的任务 但是需求里又明确指出 不允许打开系统浏览器 而我们当然也不可能
  • 159.并发编程(三):线程池,JUC

    目录 一 线程池 1 线程池的作用 2 手写线程池 3 ThreadPoolExecutor 1 线程池状态
  • 常用测试用例

    为方便平时写测试用例 整理如下 功能 条件 测试步骤 测试数据 预期结果 备注 搜索或查询 单独遍历各查询条件 测试按各查询条件是否都能够查询出相应的值 查询出符合条件的记录 设置界面上所有查询条件进行查询 单击查询按钮后 测试执行查询操作
  • 软件测试入门基础

    软件工程的四条基本原则 采取适宜的开发模型 采用合适的设计方法 提供高质量的工程支持 重视开发过程的管理 什么是软件测试 软件测试就是在软件投入运行前 对软件需求分析 设计规格说明和编码实现的最终审查 为什么要进行软件测试 软件测试就是为了
  • 深圳地区高校福利来啦!7月5日华为云开发者沙龙门票限时免费领取!

    7月5日华为云开发者沙龙深圳站开启报名 华为云专家现场手把手教你如何快速实现AI应用开发并赠送价值298元CSDN会员卡 了解行业趋势进行技术储备 高校教师 学生免费参会 报名地址 https huiyi csdn net activity
  • 谷歌浏览器关闭安全模式, 访问 http网站

    设置 隐私设置和安全性 安全 选择 不保护
  • Redis 7 第三讲 数据类型 进阶篇

    位图 bitmap 1 理论 由0和1 状态表现的二进制位的bit 数组 说明 用String 类型作为底层数据结构实现的一种统计二值状态的数据类型 位图本质是数组 它是基于String 数据类型的按位操作 该数组由多个二进制位组成 每个二
  • 基于Mahout实现协同过滤推荐算法的电影推荐系统

    1 Mahout介绍 Apache Mahout 是 Apache Software Foundation ASF 旗下的一个开源项目 提供一些可扩展的机器学习领域经典算法的实现 旨在帮助开发人员更加方便快捷地创建智能应用程序 经典算法包括
  • 实践是检验程序员的唯一标准01:用户不想跟你说话并向你扔出一张图片 - 图片上传组件开发【思路篇】...

    温馨提示 这里除了一些幼稚的小组件啥也没有温馨提示 续 这是一个新的系列 写一些实际开发中遇到的一些常用的功能 想法笨拙 代码乱套 写在前面 图片上传 作为web端一个常用的功能 在不同的项目中有不同的需求 在这里实现一个比价基本的上传图片
  • 【python基于mysql数据库实现无页面学生信息管理系统】

    python基于mysql数据库实现无页面学生信息管理系统以及简单操作mysql 前言 一 分步讲解 0 创建两张数据表 1 大概思路 2 首先连接数据库 3 查看所有学生成绩信息 4 查看所有学生个人信息 5 查看指定学生成绩信息 6 添
  • ORM中对于外键关联的处理

    根据侧重点的不同可以分为两类 一是侧重子表 即CRUD操作主要是针对子表进行的 例如书中所举的例子album 是子表 artist是主表 class AlbumMapper 1 Mapper实现的对象初始化 public Album fin
  • EXTJS2.2组件Combobox下拉框获取数据

    1 获取数据 var dataPath 远程连接 var genderStore new Ext data JsonStore proxy new Ext data HttpProxy method POST url tHarvestTab
  • 前端随笔(五)————浅谈React工程化

    1 什么是React 用于构建用户界面的 JavaScript 库 React官方文档 严格意义上来说 React并非框架 而是一个JS库 常用库 react 库 react dom 库 React具有如下特点 声明式 组件化 跨平台开发
  • 华为鸿蒙到底是不是安卓系统套了个壳?

    余承东在2月份宣布 鸿蒙将于4月份全面上线 果然没有食言 华为鸿蒙2 0来了 首批升级机型名单包括 Mate X2 Mate40以及P40系列 需要注意的是这次上线的鸿蒙OS依旧只是开发者测试版 还不是正式版本 另外花粉们必须前往官网申请加
  • C语言之冒泡排序、快速排序法、希尔排序法

    众所周知编程排序方法众多而且程序的好坏就取决于算法的使用 下面是博主现在会的几种排序方法希望对大家有所帮助 希尔排序法 Author Stylle Date 2020 11 14 15 52 03 LastEditors Stylle La
  • Java - 根据文件绝对路径,来删除文件

    目录 一 根据文件绝对路径 来删除文件 参考链接 一 根据文件绝对路径 来删除文件 import org springframework web multipart MultipartFile import java io IOExcept
  • Base64编码与解码 ——Python实现

    文章目录 1 引言 2 Base64简介 3 预习知识 3 1 字节 3 2 二进制 与字节 3 3 ASCII码 3 Base64编码 3 1 个人理解 3 2 代码实现 4 Base64解码 4 1 个人理解 4 2 代码实现 1 引言