Base64编码原理
文章目录
一、Base64的由来
电子邮件刚问世的时候,只能传输英文,但后来随着用户的增加,中文、日文等文字的用户也有需求,但这些字符并不能被服务器或网关有效处理,为解决这一问题,最好的方案是在不改变传输协议的基础上,做一种扩展方案来支持非ASCII内容传输,把非 ASCII 字符用ASCII来表示,Base64编码应运而生。随之,Base64在URL、Cookie、网页传输少量二进制文件中也有相应的使用。
二、什么是Base64?
Base64 是一种编码方式
,最早出现在电子邮件传输协议中。Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
三、Base64编码原理
Base64 将8比特位为一个单元的字节数据拆分为以6个比特位为一个单元的二进制片段,不足6个比特位的在后面补0,在转为字符后补0的位置以=
表示,2个0替换一个=
号。每6个比特位单元对应Base64索引表中的一个字符,这样最终构成一个 超过编码前字节数据33% 的字符串。
Base64索引图如下图所示:
ASCII表如下图所示:
举个栗子:
将ABC
三个字符进行base64编码,编码过程如下:
文 本: A B C
ASCII码: 65 66 67
8bit位: 01000001 01000010 01000011
<-----------------------将8bit位化为6bit位----------------------->
6bit位: 010000 010100 001001 000011
Base64索引: 16 20 9 3
Base64编码: Q U J D
8bit位:010000010100001001000011
6bit位:010000010100001001000011
3*8=24 24/6=4
8bit位刚好能化为6bit位,不要补0.
注意:
ASCII码到 8bit位之间,是将ASCII转化位8位的二进制。6bit位到Base64索引之间,是将6位的二进制转化为十进制。
将abcd
四个字符进行base64编码,编码过程如下:
文 本: a b c d
ASCII码: 97 98 99 100
8bit位: 01100001 01100010 01100011 01100100
<----------------------将8bit位化为6bit位---------------------->
6bit位: 011000 010110 001001 100011 011001 000000
Base64索引: 24 22 9 35 25 0
Base64编码: Y W J j Z A==
8bit位:01100001011000100110001101100100
6bit位:011000010110001001100011011001000000
4*8=32 32/6=5*6 + 2
8bit位化为6bit位时,还差4位才能补齐最后的6位,因此在末尾补了4个0,当6bit位根据Base64索引表化为字符后需要在末尾补两个'==',一个'='代表补了两个0。
四、通过Python实现Base64编码
方案一:通过编码过程自己写Base64编码
b64_dict = {
0: 'A', 17: 'R', 34: 'i', 51: 'z',
1: 'B', 18: 'S', 35: 'j', 52: '0',
2: 'C', 19: 'T', 36: 'k',