使用Python进行Base64编码和解码
假设您有一个想要通过网络传输的二进制图像文件。您很惊讶对方没有正确接收该文件 - 该文件只是包含奇怪的字符!
嗯,您似乎试图以原始位和字节格式发送文件,而所使用的媒体是为流文本而设计的。
避免此类问题的解决方法是什么?答案是Base64编码。在本文中,我将向您展示如何使用 Python 对二进制图像进行编码和解码。该程序被说明为一个独立的本地程序,但您可以将该概念应用于不同的应用程序,例如将编码图像从移动设备发送到服务器以及许多其他应用程序。
什么是 Base64?
在深入了解本文之前,让我们先定义一下 Base64 的含义。
Base64 是一种将 8 位二进制数据编码为可以用 6 位表示的格式的方法。仅使用字符 A-Z、a-z、0-9、+、 / 用来表示数据,其中 = 用于填充数据。例如,使用此编码,三个 8 位字节将转换为四个 6 位组。
术语 Base64 取自多用途互联网邮件扩展 (MIME) 标准,该标准广泛用于 HTTP 和 XML,最初是为编码电子邮件附件以进行传输而开发的。
我们为什么使用 Base64?
Base64 对于二进制数据表示非常重要,因此它允许二进制数据以看起来和充当纯文本的方式表示,这使得存储在数据库中、在电子邮件中发送或在其他应用程序中使用更加可靠。基于文本的格式,例如 XML。 Base64 主要用于以 ASCII 字符串格式表示数据。
正如本文介绍中提到的,如果没有 Base64,有时数据将根本无法读取。
Base64 编码
Base64 编码是将二进制数据转换为 64 个字符的有限字符集的过程。如第一节所示,这些字符是 A-Z、a-z、0-9、 + 和 / (数一数,你注意到它们加起来是 64 了吗?)。该字符集被认为是最常见的字符集,被称为 MIME 的 Base64。它使用 A-Z、a-z 和 0-9 作为前 62 个值,以及 + 和 / 用于最后两个值。
Base64编码的数据最终会比原始数据更长,因此如上所述,每3个字节的二进制数据,至少有4个字节的Base64编码数据。这是因为我们将数据压缩成更小的字符集。
您是否见过如下所示的原始电子邮件文件的一部分(很可能源自未发送的电子邮件)?如果是这样,那么您已经看到了 Base64 编码的实际应用! (如果你注意到最后有 = ,你可以断定这是 Base64 编码,因为编码过程中使用了等号进行填充。)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base642KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ
h9iMDQoNCtij2YjYryDZgdmC2Lcg2KfZhNin2LPYqtmB2LPYp9ixINi52YYg2KfZhNmF2YLYsdix
2KfYqiDYp9mE2K/Ysdin2LPZitipINin2YTYqtmKINiq2YbYtdit2YjZhiDYqNmH2Kcg2YTZhdmG
INmK2LHZitivINin2YTYqtmI2LPYuSDZgdmKDQrYt9mE2Kgg2KfZhNi52YTZhSDYp9mE2LTYsdi5
2YrYjCDYudmE2YXYpyDYqNij2YbZiiDYutmK2LEg2YXYqtiu2LXYtSDYqNin2YTYudmE2YUg2KfZ
hNi02LHYudmKINmI2KPZgdiq2YLYryDZhNmE2YXZhtmH2Kwg2KfZhNi52YTZhdmKDQrZhNiw2YTZ
gy4NCg0K2KzYstin2YPZhSDYp9mE2YTZhyDYrtmK2LHYpyDYudmE2Ykg2YbYtdit2YPZhSDZgdmK
INmH2LDYpyDYp9mE2LTYo9mGLg0KDQrYudio2K/Yp9mE2LHYrdmF2YYNCg==
--089e0141aa264e929a0514593016
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64
Base64分多步进行,如下:
- 要编码的文本转换为其各自的十进制值,即转换为相应的 ASCII 值(即 a:97、b:98 等)。这是 ASCII 表。
- 将上述步骤中获得的十进制值转换为其等价的二进制值(即 97: 01100001)。
- 将所有二进制等价物连接起来,获得一大组二进制数。
- 一大堆二进制数被分成相等的部分,每个部分仅包含 6 位。
- 相等的 6 位组将转换为其十进制等效值。
- 最后,十进制等值转换为其 Base64 值(即 4: E)。以下是十进制值及其 Base64 字母表。
Base64解码
Base64 解码与 Base64 编码相反。换句话说,它是通过与上一节中描述的步骤相反的步骤来执行的。
所以Base64解码的步骤可以描述如下:
- 字符串中的每个字符都会更改为其 Base64 十进制值。
- 获得的十进制值将转换为其等价的二进制值。
- 从获得的每个二进制数中截断二进制数的前两位,并将这组 6 位组合在一起,形成一大串二进制数字。
- 将上一步获得的大串二进制数字分成 8 位一组。
- 8 位二进制数将转换为其等值的十进制数。
- 最后,将获得的十进制值转换为相应的 ASCII 值。
字符串的Base64编码和解码
一旦您了解了幕后发生的事情,您就会更容易理解这一切是如何运作的。让我们尝试编码和解码一个简单的三字母单词,Hey。
我们首先将单词的每个字母转换为其等效的 ASCII,然后将等效的 ASCII 转换为二进制。这为我们提供了以下值:
| 信 | ASCII 索引值 | 8 位二进制值 |
|---|---|---|
| H | 72 | 01001000 |
| e | 101 | 01100101 |
| y | 121 | 01111001 |
换句话说,我们可以像这样以二进制形式编写 Hey:
01001000 01100101 01111001
总共 24 位,当转换为 6 位组时,每个位产生四个值:
010010 000110 010101 111001
在 Base64 表中,字符 A 到 Z 由值 0 到 25 表示。字符 a 到 z 由值 26 到 51 表示。数字 0 到 9 由值 52 到 61 表示。字符 + 和 / 用 62 和 63 表示。字符 = 用于在无法将位正确分为 6 组时进行填充。
我们现在将重新排列的位转换为数值,然后获取代表这些数值的字符。
| 6 位二进制值 | Base64 索引值 | 信 |
|---|---|---|
| 010010 | 18 | 小 |
| 000110 | 6 | G |
| 010101 | 21 | V |
| 111001 | 57 | 5 |
根据我们上面的计算,字母 Hey 在 Base64 编码时将变成 SGV5。我们可以使用以下代码测试这是否正确:
from base64 import b64encodetext_binary = b'Hey'# SGV5
print(b64encode(text_binary))
整个过程反向完成,在Base64解码后得到我们的原始数据。
现在,我将快速向您展示另一个单词 Heyo 的编码,以解释编码字符串中 = 的出现。
| 信 | ASCII 索引值 | 8 位二进制值 |
|---|---|---|
| H | 72 | 01001000 |
| e | 101 | 01100101 |
| y | 121 | 01111001 |
| o | 111 | 01101111 |
一共有32位。这将为我们提供五个不同的 6 位组,其中有两个剩余位:11。我们用 0000 填充它们以获得 6 位组。根据上述排列将 6 位组成一组将得到以下结果:
010010 000110 010101 111001 011011 110000
重新排列的位将根据 Base64 索引值返回以下字符。
| 6 位二进制值 | Base64 索引值 | 信 |
|---|---|---|
| 010010 | 18 | 小 |
| 000110 | 6 | G |
| 010101 | 21 | V |
| 111001 | 57 | 5 |
| 011011 | 27 | b |
| 110000 | 48 | w |
这意味着 Heyo 的 Base64 编码值为 SGV5bw==。每个 = 代表一对 00,我们添加它们用于填充原始位序列。
from base64 import b64encodetext_binary = b'Heyo'# SGV5bw==
print(b64encode(text_binary))
对图像进行 Base64 编码
现在让我们开始讨论本文的重点。在本节中,我将向您展示如何使用 Python 轻松地对图像进行 Base64 编码。
我将使用以下二进制图像。继续下载它,让我们开始使用 Python! (我假设图像的名称是 deer.gif。)

为了在Python中使用Base64,我们要做的第一件事就是导入base64模块:
导入base64
为了对图像进行编码,我们只需使用函数 base64.b64encode(s) 即可。 Python对该函数的描述如下:
使用 Base64 对类似字节的对象
s进行编码并返回编码后的字节。
因此,我们可以执行以下操作来对图像进行 Base64 编码:
import base64
image = open('deer.gif', 'rb') #open binary file in read mode
image_read = image.read()
image_64_encode = base64.b64encode(image_read)
如果您想查看编码过程的输出,请键入以下内容:
打印 image_64_encode
Base64 解码图像
要使用 Python 解码图像,我们只需使用 base64.b64decode(s) 函数。 Python 提及了有关此函数的以下内容:
解码 Base64 编码的类似字节的对象或 ASCII 字符串并返回解码后的字节。
因此,为了解码我们在上一节中编码的图像,我们执行以下操作:
base64.decode(image_64_encode)
把它们放在一起
让我们将用于 Base64 编码和解码图像的程序放在一起。执行此操作的 Python 脚本应如下所示:
import base64
image = open('deer.gif', 'rb')
image_read = image.read()
image_64_encode = base64.b64encode(image_read)
image_64_decode = base64.b64decode(image_64_encode)
image_result = open('deer_decode.gif', 'wb') # create a writable image and write the decoding result
image_result.write(image_64_decode)
如果您打开桌面上的 deer_decode.gif,您会发现您拥有我们在第一步中编码的原始图像 deer.gif。
正如我们从本文中看到的,Python 使执行看似复杂的任务变得非常容易。
URL 安全编码和解码
正如我在本教程前面提到的,除了常规字母数字值之外,Base64 编码还使用字符 + 和 / 。但是,这些字符在 URL 中具有特殊含义。这意味着使用这些字符的 Base64 编码值如果在 URL 内部使用,可能会导致意外行为。
此问题的一种解决方案是使用 urlsafe_base64encode() 和 urlsafe_base64decode() 函数对任何数据进行编码和解码。这些函数在编码过程中将 + 替换为 -,将 / 替换为 _。
下面是一个 Python 示例,显示了这种差异:
import base64image = open('dot.jpg', 'rb')
image_data = image.read()unsafe_encode = base64.b64encode(image_data)
safe_encode = base64.urlsafe_b64encode(image_data)# b'/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNr....
print(unsafe_encode)# b'_9j_4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP_sABFEdWNr....
print(safe_encode)
学习Python
无论您是刚刚入门还是希望学习新技能的经验丰富的程序员,都可以通过我们完整的 Python 教程指南学习 Python。
这篇文章已根据 Nitish Kumar 的贡献进行了更新。 Nitish 是一名 Web 开发人员,拥有在各种平台上创建电子商务网站的经验。他将业余时间花在个人项目上,让他的日常生活变得更轻松,或者在晚上与朋友一起散步。
相关文章:
使用Python进行Base64编码和解码
假设您有一个想要通过网络传输的二进制图像文件。您很惊讶对方没有正确接收该文件 - 该文件只是包含奇怪的字符! 嗯,您似乎试图以原始位和字节格式发送文件,而所使用的媒体是为流文本而设计的。 避免此类问题的解决方法是什么?答…...
MongoDB的数据恢复与备份
MongoDB的数据恢复与备份 在MongoDB中,备份和恢复数据是一项关键任务,可以确保数据的安全性并防止意外数据丢失。本文将介绍MongoDB的数据恢复与备份原理并提供相关的编程代码和配置。 1. 数据备份原理 MongoDB提供了多种备份数据…...
Java之SpringCloud Alibaba【五】【微服务 Sentinel整合openfeign进行降级】
一、Sentinel整合openfeign 1、复制一下order-openfeign项目(创建order-openfeign-sentinel) 然后在stock-nacos当中编写对应的接口 RequestMapping("/reduct2")public String reduct2(){int a 1/0;System.out.println("扣减库存"…...
电脑前置耳机没声音怎么办
有很多小伙伴反映在将自己的耳机连接到主机前面时没有声音,这是怎么回事呢,遇到这种情况应该怎么解决呢,下面小编就给大家详细介绍一下电脑前置耳机没声音的解决方法,有需要的小伙伴可以来看一看电脑前面耳机没声音。 解决方法&a…...
package.json 详解
文章目录 package.json1. name2. version3. description4. homepage5. bugs6. license7. author, contributors8. funding9. files10. main11. module12. browser13. bin14. man15. directories15.1 directories.bin15.2 directories.man 16. repository17. scripts18. config1…...
springboot配置ym管理各种日记(log)
1:yml配置mybatis_plus默认日记框架 mybatis-plus:#这个作用是扫描xml文件生效可以和mapper接口文件使用,#如果不加这个,就无法使用xml里面的sql语句#启动类加了MapperScan是扫描指定包下mapper接口生效,如果不用MapperScan可以在每一个mapp…...
你知道Vue 3.0中Treeshaking特性吗?
介绍 Vue 3.0引入了Tree-shaking特性,旨在优化构建过程并减小最终生成的代码大小。Tree-shaking是一种在构建时移除未使用代码的技术,通过分析模块的依赖关系,将没有被引用的部分从最终的打包文件中排除掉。这可以大大减少应用的体积&#x…...
TP6 开启关闭debug
config 不起作用,还得来这里改: 或者单个方法里加: $this->app->debug(true); //临时错误调试...
Linux centos7 bash编程(break和continue)
在学习shell知识时,简单编程要从格式入手。 首先学习好单行注释和多行注释。 先学习简单整数的打印输出,主要学习echo命令,学习选项-e -n的使用。 下面的练习是常用的两个分支跳转程序:break和continue。 #!/bin/bash # 这是单…...
【论文精读AAAI_2022】MobileFaceSwap: A Lightweight Framework for Video Face Swapping
【论文精读AAAI_2022】MobileFaceSwap: A Lightweight Framework for Video Face Swapping 一、前言AbstractIntroductionRelated WorkFace swapping.Dynamic neural networks.Knowledge distillation.MethodNetwork ArchitectureTraining ObjectivesExperimentsQualitative Re…...
rust中使用sqlite 之 rusqlite使用
名称版本rusqlite0.29.0impl From<&rusqlite::Row<_>> for Person {fn from(r: &rusqlite...
Linux系统Ubuntu配置Docker详细流程
本文介绍在Linux操作系统Ubuntu的18.04及以上版本中,配置开源容器化平台和工具集Docker的详细方法;其中,我们以配置Docker平台的核心组件之一——Docker Engine为例来详细介绍。 首先,大家需要明确,我们常说的Docker&a…...
能直接运营的发接任务平台小程序搭建开发演示
有个项目估计做过互联网的小伙伴都听说过——发接任务平台。 基本每年都有发接任务平台关站,但又有新的平台出来,往复循环,无比热闹。这在互联网圈不常见,互联网项目很多都是风头过去了就结束了,但发接任务年年似乎都…...
React原理 - React Reconciliation-上
目录 扩展学习资料 React Reconciliation Stack Reconciler【15版本、栈协调】 Stack Reconciler-事务性 事务性带来的弊端: 扩展学习资料 名称 链接 备注 官方文档 Reconciliation – React 英文 stack reconciler Implementation Notes – React 英文…...
MySQL 主从复制与读写分离
1、什么是读写分离? 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 2、为什么…...
Linux环境基础开发工具
xshellssh xshell--充当客户端,提供远程登录服务 yum 背景知识 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放…...
uni-app+uView实现点击查看大图片的效果
<u-button text"月落" click"imgPreview()"></u-button> //注意:参数urls 是预览图片的链接地址,是个数组 imgPreview() {uni.previewImage({indicator: "none",loop: false,urls: [],}) },参数说…...
Sulfo-CY3 azide在细胞标记与成像中的应用-星戈瑞
Sulfo-CY3azide作为荧光探针在细胞标记与成像中应用,它可以用于实现对细胞内特定分子或细胞结构的标记,从而实现对细胞的可视化和实时成像。以下是Sulfo-CY3azide在细胞标记与成像中的应用: 1.细胞膜标记:Sulfo-CY3azide可以与细…...
js如何遍历对象的key和value
在JavaScript中,可以使用for…in循环来遍历对象的键(key)和值(value)。以下是一个示例: let obj { key1: value1, key2: value2, key3: value3 }; for (let key in obj) { if (obj.hasOwnProperty…...
官方发布:Mac 版 Visual Studio IDE将于明年 8 月 31 日停止支持
近日,微软官方宣布:适用于 Mac 平台的 Visual Studio 集成开发环境(IDE)已经启动 "退休" 进程。Visual Studio for Mac 17.6 将继续支持 12 个月,持续到 2024 年 8 月 31 日。 微软表示在未来的 1 年内将重…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
