参考链接:

  • 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. 例-1
  2. 试将数据 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 编码相关推荐

  1. Python 简易实现 quoted-printable 编码

    参考链接: 网络管理员在线工具 python模块之quopri: quoted-printable编解码 以下有关内容基于 Python 3: Python 简易实现 quoted-printable ...

  2. python图片转base64编码,与base64编码转图片

    在线工具可以使用:https://tool.chinaz.com/tools/imgtobase 使用python的话,需要安装: pip install Pillow 然后就可以使用下面的示例代码进 ...

  3. python生成图片base64编码及阿里云验证码识别

    一.问题背景 自动化测试时,注册页面需要输入验证码,为此需要截取下验证码图片,然后调用识别出其中文字信息,以模拟输入 阿里云验证码识别api链接 通过此链接可以查看此api调用信息: 如下是api调试 ...

  4. Java中BASE64 编码

    2019独角兽企业重金招聘Python工程师标准>>> BASE64 编码是一种常用的字符编码,在很多地方都会用到.JDK 中提供了非常方便的 BASE64Encoder 和 BAS ...

  5. Python 对图像进行base64编码及解码读取为numpy、opencv、matplot需要的格式

    Python 对图像进行base64编码及解码读取为numpy.opencv.matplot需要的格式 1. 效果图 2. 源码 参考 这篇博客将介绍Python如何对图像进行base64编解码及读取 ...

  6. python使用base64编码解码数据

    python使用base64编码解码数据 base64模块是用来作base64编码解码,常用于小型数据的传输.编码后的数据是一个字符串,其包括a-z.A-Z.0-9./.+共64个字符,即可用6个字节 ...

  7. Python 技术篇-用base64库对音频、图片等文件进行base64编码和解码实例演示

    最近在研究项目,需要调用百度语音的api,传入参数需要本地语音文件 base64 位编码后内容.下面来演示一下. 其实很简单,base64 是系统自带的库. base64.b64encode() 进行 ...

  8. python base64编码_JS和Python实现AES算法

    1. AES原理 AES算法是典型的对称加密算法,AES原理可以学习这两篇文档: 漫画:什么是AES算法:https://www.toutiao.com/i6783550080784794124/ A ...

  9. python兼容js base64_前端base64编码的坑

    故事背景: 前后端每次通讯的时候,需要验证sign,这个sign经过了b64_md5两步骤操作. 在python端,生成sign的代码如下: import md5 import base64 m = ...

  10. 【前端】【labelme】labelme 保存 imageData 的 base64编码机制 —— python 源码探究与 js 实现

    labelme 保存 imageData 机制探究 python调试 js实现 python调试 import json import numpy as npfrom cv2 import cv2im ...

最新文章

  1. day13 内置函数一
  2. c语言通用Makefile
  3. 华工软院17级“软件需求分析”课程大作业
  4. python字典删除元素_Python简单遍历字典及删除元素的方法
  5. 计算机网络阅读报告,计算机网络实验二报告
  6. CSS3 Flex布局子元素的属性
  7. 实验二:SET-UID程序漏洞实验
  8. 【Oracle】用户管理
  9. 计算机应用基础第3次平时作业,计算机应用基础第3次作业.doc
  10. sklearn报错 ImportError: No module named externals 问题解决
  11. Sentence2vec
  12. PHP 中文手册-国内镜像
  13. android 自定义emoji表情包,emoji表情制作
  14. gp数据库与pg数据库
  15. 《Java并发编程实战》读书笔记-第5章 基础构建模块
  16. 绝地求生大逃杀地图分析
  17. 为指针分配和释放空间
  18. 苹果机皇称号实至名归,面临淘汰的它,是不是你心中的机皇
  19. alpha shapes提取边界原理及详细步骤
  20. 没有IT工作经验找工作难吗?

热门文章

  1. 航天晨光:永中DCS与原有OA系统整合,文件阅览效率大幅提升!
  2. 2018AHU新生赛Panelatta与华容道题解
  3. 强化学习第7章——基于策略的强化学习
  4. 第四届中国软件开源创新大赛通知
  5. 选取销售订单开发票,控制销售订单中已开票金额
  6. linux常见维护命令报错,Linux系统维护命令小结.ppt
  7. 宽带通云解析结合用友致远A6使用方法
  8. 20年以后的科技发展小短文计算机,20年后的我小学想象作文
  9. 算法刷题【洛谷P1359】租用游艇(最短路径Floyd算法和Dijkstra算法模板题)
  10. 如何听清楚、说明白--《结构思考力》