1.什么是编码解码
编码:利用特定的算法,对原始内容进行处理,生成运算后的内容,形成另一种数据的表现形式,可以根据算法,再还原回来,这种操作称之为编码。
解码:利用编码使用的算法的逆运算,对经过编码的数据进行处理,还原出原始数据,这种操作称之为解码。
2.什么是Base64编码算法
将任意的字节数组数据,通过Base64算法,生成只有(大小写英文、数字、+、/)(一共64个字符)内容表示的字符串数据。即将任意的内容转换为可见的字符串形式。
3.为什么需要Base64编码
Base64算法最开始是被用于解决电子邮件数据传输问题。以前发送邮件只支持可见字符的传送,但ASCII码中,有一部分不支持直接显示。由此,需要有一个方法将不可见的字符转换为可见的字符,便产生了Base64编码算法。
4.Base64算法的实现
特点:
- 将数据按照 3个字节一组的形式进行处理,每三个字节在编码之后被转换为4个字节。即:如果一个数据有6个字节,可编码后将包含6/3*4=8个字节
- 当数据的长度无法满足3的倍数的情况下,最后的数据需要进行填充操作,即补“=” ,这里“=”是填充字符,不要理解为第65个字符。因此我们经常看见base64编码的字符串结尾有几个”=”号
示例:
上面示例将原始数据的每三个字节分为一组,按位进行分割为每6位一个字节的形式,进行转换,形成新的4个字节。空缺的两个bit用0填补。
这四个字节才通过Base64编码表进行映射,形成最后实际的Base64编码结果。
如果原始数据最后无法凑成3个字节,则以“=”填充。
注:上图中的1234567表示bit的位置,不是bit的值。
将字符串”ABC”进行Base64编码流程如下。
1.使用ASCII编码方式将字符串”ABC”转换成二进制数据 01000001 | 01000010 | 01000011
2.将步骤1的二进制数据进行分组,每个分组6bit 010000 | 010100 | 001001 | 000011
3.将步骤2的4组6bit二进制编码数据进行补位(高位补0),变成4组8bit二进制 00010000 | 00010100 | 00001001 | 00000011
4.将步骤3中的4组8bit转换成十进制。16 | 20 | 9 | 3
5.以步骤4的十进制数据为索引,去Base64编码映射表中寻找对应的字符。16在编码表中映射的字符是Q,20映射的字符是U,9映射的字符是J,3映射的字符是D。
所以,字符串”ABC”经过Base64编码后的数据是”QUJD”。
Base64编码索引表
26个字母 * 2(大小写) + 10个数字 + 2个运算符号 = 64个字符
5.应用场景
http协议中,GET方式和POST方式是Http请求常用的两种方式,GET方法只能传递ASCII数据,但某些情况下会要求使用GET来传递二进制数据。
此时用Base64对Get传输的二进制数据,编码成ASCII数据,例如,客户端和服务器传递JSON数据时,经常会进行base64编解码。
注意:
- Base64是编码算法,不是加密算法,只是用来编码二进制的字节数组,形成可视的ASCII字符串。
- Base64编码实际上是把原数据的3个字节映射成了4个字节,所以相比于原数据长度,编码后的长度会增加1/3。会降低传输效率。