Python 简易实现 base64 编码
参考链接:
- base64 - 百度百科
- python中base64编码与解码
- 编码、进制转换、汉字转二进制
- Python将形如”\xe4…"的十六进制编码字符串恢复为中文
以下有关内容基于 Python 3:
Python 简易实现 base64 编码
目录
1. 什么是 base64 编码
2. 举例说明
3. 如何用 Python 实现
4. 具体代码
5. 代码运行展示
6. 更简单的代码
7. 心得总结
一、什么是 base64 编码 ↶
对于任意的二进制文件,可用 base64 编码。这种编码方法是先把二进制代码划分为一个个 24 位长的单元,然后把每一个 24 位单元划分为 4 个 6 位组。每一个 6 位组按以下方法转换为 ASCII 码。6 位的二进制码共有 64 种不同的值,从 0 到 63。用 A 表示 0,用 B 表示 1,等等。26 个大写字母排列完毕之后,接下去再排 26 个小写字母,在后面是 10 个数字。最后用 “+” 表示 62,用 “/” 表示 63。再用两个连在一起的等号 “==” 和 一个等号 “=” 分别表示最后一组的代码只有 8 位或 16 位。回车和换行都忽略,它们可在任何地方插入。 —— 摘自 《计算机网络(第7版)》
简单点说,就是每个字节变为 8 位二进制,拼在一起,其中每 6 位转变为一个 ASCII 码,不足位填充 0 直至满足 6 位的条件,继续转变为 ASCII 码。将这些二进制 ASCII 码变为十进制,接着查找 base64 编码表,所得的结果组成的字符串就是 base64 编码的结果,不足 4 的倍数,末尾添加 = 。通过 base64 编码,只需要用简单的 ascii 码,就能表示繁多的二进制文件中复杂的数据。
二、举例说明 ↶
- 例-1:
- 试将数据 11001100 10000001 00111000 进行 base64 编码,并得到最后传输的 ASCII 数据。
先将 24 比特的二进制数字划分为 4 个 6 位组:
110011 001000 000100 111000,得出十进制的值 51,8,4,56。因为 6 位组的值在 0 到 63 之间,因此每一个值可以唯一地与一个 ASCII 代码相对应。
根据 base64 编码表,把上面的这些值转换为对应的 ASCII 代码:zIE4
以上的过程可以由下图表示:
再查找 ASCII 编码表,得出对应的二进制代码为:
01111010 01001001 01000101 00110100
三、如何用 Python 实现 ↶
那么,该如何用 Python 实现这些步骤呢?
让我们一步一步解决问题【假设我们已经获得一个字符串】:
1. 想办法将字符串中所有的内容变为十进制
(1)ascii 码,可以直接通过内置函数完成:
>>>a = "A"
>>>b = ord(a)
>>>b
>65
(2)非 ascii 码,通过编码:
>>>a = '哔哩哔哩弹幕网'
>>>b = a.encode('utf-8')
>>>b
>b'\xe5\x93\x94\xe5\x93\xa9\xe5\x93\x94\xe5\x93\xa9\xe5\xbc\xb9\xe5\xb9\x95\xe7\xbd\x91'
可以得到一连串的 16 进制码,\x
后面的两个字符,就是十六进制后的结果。
接下来,我们就要尝试把这些 16 进制的内容,变为十进制数字,用内置函数 list 直接转换为十进制列表:
>>>a = '哔哩哔哩弹幕网'
>>>b = a.encode('utf-8')
>>>list(b)
>[229, 147, 148, 229, 147, 169, 229, 147, 148, 229, 147, 169, 229, 188, 185, 229, 185, 149, 231, 189, 145]
这就很方便了。
2. 将十进制数字转换为二进制
>>>b = 10
>>>str(bin(b))[2:]
>'1010'
3. 经过我的研究,要将不足8位的二进制,填充为 8 位二进制
>>>a = '11000'
>>>a.zfill(8)
>'00001100'
4. 拼接二进制字符串,并填充二进制字符串为 6 的倍数,用 0 填充
方法很多我就不多介绍了。
5. 划分二进制字符串,6 位为一个单元
6. 将 6 位二进制串,转换为十进制数字,并查找 base64 编码表
>>>a = '10'
>>>b = int(a, 2)
>>>b
>2
查找 base64 编码表,可以通过创建一个键值对应的字典,来实现查找内容,如果不想手动行行输入的话,尝试用编程解决 base64 编码表生成的问题,比如:
string_temp = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' '0123456789+/')
base64_dict = {}
for i in range(2**6):base64_dict[i] = string_temp[i]
7. 查完表后,组成字符串,检查是否为 4 的倍数,不足填充 = ,直到满足 4 的倍数为止。
因为简单的 base64 编码或其他情况,会因为不足 4 的倍数,而填充 = ,因此我们这里也要实现填充 = 的功能
到此,base64 编码也就是实现完成,接下来用具体的代码,来完成上面的步骤。
四、具体代码 ↶
测试例子:哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
,ascii + 非 ascii:
class MyBase64():base64_dict = {}string_temp = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' '0123456789+/')ascii_string = ''.join([chr(i) for i in range(4, 2**7-1)])def __init__(self, string):# 初始化,创建 base64 编码字典self.string = stringfor i in range(2**6):self.base64_dict[i] = self.string_temp[i]def convert(self):# base64 编码过程# 编码string_encode_byte = self.string.encode('utf-8')# 十进制化string_digit_list = list(string_encode_byte)# 二进制化 + 0 填充string_bin_list = []for item in string_digit_list:string_bin_list.append(str(bin(item))[2:].zfill(8))# 字符串合并string_sum = ''.join(string_bin_list)# 6 的倍数,不足 0 填充string_fill = self.fillIt(string_sum, factor=6, item='0')# 切片,6位一个单位string_bin_list2 = self.splitIt(string_fill, bits=6)# 十进制化string_digit_list2 = []for item in string_bin_list2:string_digit_list2.append(int(item, 2))# 查表string_base64_list = []for item in string_digit_list2:string_base64_list.append(self.base64_dict[item])# 拼接string_sum2 = ''.join(string_base64_list)# 4 的倍数,不足填充 = string_convert = self.fillIt(string_sum2, factor=4, item='=')return string_convertdef fillIt(self, string, factor, item):"""指定倍数填充指定字符string:原字符串factor:倍数item:填充字符"""length = len(string)remainder = length % factorif remainder:times = factor - remainderstring = string + times * itemreturn stringdef splitIt(self, string, bits):"""指定位数切片string:原字符串bits:每次切片数量"""length = len(string)new_list = []for i in range(bits, length+1, bits):new_list.append(string[i-bits:i])remain = length % bitsif remain != 0:new_list.append(string[-remain:])return new_listif __name__ == '__main__':test_string = '哔哩哔哩 (゜-゜)つロ 干杯~-bilibili'myBase64 = MyBase64(test_string)string = myBase64.convert()print("测试字符串:{}".format(test_string))print("base64:{}".format(string))
五、代码运行展示 ↶
截图自:站长工具 > Base64加密解密
六、更简单的代码 ↶
其实 Python 自带了 base64 编码的库:
import base64s = '哔哩哔哩 (゜-゜)つロ 干杯~-bilibili'.encode()
a = base64.b64encode(s)
print(a)
base64 库,可以方便地将原字符串转变为 base64 编码后的结果。
七、心得总结 ↶
虽然有 base64 库,可以方便的编码,但是知道了 base64 编码到底是怎么回事之后,对它的掌握将更加的随心所欲。而且,Python 编码确实是个头疼的问题。在这次实现 base64 过程中,我们就能发现,能深入浅出的懂得如何使用 Python 的编码也是一件很重要的事情。
点我回顶部 ☚
Fin.
Python 简易实现 base64 编码相关推荐
- Python 简易实现 quoted-printable 编码
参考链接: 网络管理员在线工具 python模块之quopri: quoted-printable编解码 以下有关内容基于 Python 3: Python 简易实现 quoted-printable ...
- python图片转base64编码,与base64编码转图片
在线工具可以使用:https://tool.chinaz.com/tools/imgtobase 使用python的话,需要安装: pip install Pillow 然后就可以使用下面的示例代码进 ...
- python生成图片base64编码及阿里云验证码识别
一.问题背景 自动化测试时,注册页面需要输入验证码,为此需要截取下验证码图片,然后调用识别出其中文字信息,以模拟输入 阿里云验证码识别api链接 通过此链接可以查看此api调用信息: 如下是api调试 ...
- Java中BASE64 编码
2019独角兽企业重金招聘Python工程师标准>>> BASE64 编码是一种常用的字符编码,在很多地方都会用到.JDK 中提供了非常方便的 BASE64Encoder 和 BAS ...
- Python 对图像进行base64编码及解码读取为numpy、opencv、matplot需要的格式
Python 对图像进行base64编码及解码读取为numpy.opencv.matplot需要的格式 1. 效果图 2. 源码 参考 这篇博客将介绍Python如何对图像进行base64编解码及读取 ...
- python使用base64编码解码数据
python使用base64编码解码数据 base64模块是用来作base64编码解码,常用于小型数据的传输.编码后的数据是一个字符串,其包括a-z.A-Z.0-9./.+共64个字符,即可用6个字节 ...
- Python 技术篇-用base64库对音频、图片等文件进行base64编码和解码实例演示
最近在研究项目,需要调用百度语音的api,传入参数需要本地语音文件 base64 位编码后内容.下面来演示一下. 其实很简单,base64 是系统自带的库. base64.b64encode() 进行 ...
- python base64编码_JS和Python实现AES算法
1. AES原理 AES算法是典型的对称加密算法,AES原理可以学习这两篇文档: 漫画:什么是AES算法:https://www.toutiao.com/i6783550080784794124/ A ...
- python兼容js base64_前端base64编码的坑
故事背景: 前后端每次通讯的时候,需要验证sign,这个sign经过了b64_md5两步骤操作. 在python端,生成sign的代码如下: import md5 import base64 m = ...
- 【前端】【labelme】labelme 保存 imageData 的 base64编码机制 —— python 源码探究与 js 实现
labelme 保存 imageData 机制探究 python调试 js实现 python调试 import json import numpy as npfrom cv2 import cv2im ...
最新文章
- day13 内置函数一
- c语言通用Makefile
- 华工软院17级“软件需求分析”课程大作业
- python字典删除元素_Python简单遍历字典及删除元素的方法
- 计算机网络阅读报告,计算机网络实验二报告
- CSS3 Flex布局子元素的属性
- 实验二:SET-UID程序漏洞实验
- 【Oracle】用户管理
- 计算机应用基础第3次平时作业,计算机应用基础第3次作业.doc
- sklearn报错 ImportError: No module named externals 问题解决
- Sentence2vec
- PHP 中文手册-国内镜像
- android 自定义emoji表情包,emoji表情制作
- gp数据库与pg数据库
- 《Java并发编程实战》读书笔记-第5章 基础构建模块
- 绝地求生大逃杀地图分析
- 为指针分配和释放空间
- 苹果机皇称号实至名归,面临淘汰的它,是不是你心中的机皇
- alpha shapes提取边界原理及详细步骤
- 没有IT工作经验找工作难吗?