Base64是一种用64个字符来表示任意二进制数据的方法。
# Base64 编码表(标准)
相信我们都知道ASCII 编码,从A-Z、a-z、0-9和一些其他的特殊字符,这些<mark>字符都有唯一的一个数字来表示</mark>。
同理Base64也有这样一套编码。
范围是”A-Z“、”a-z“、”0-9“、”+“、”/“一共64个字符。
我们给出一个表格来看一下,<mark>这个比ASCII编码要简单多了,只有64个</mark>。
由于索引是从0开始,所以最后的索引是63。
用途
-
Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。
-
网络上传递图片:
编码图片的话,会把字符+
和/
分别变成-
和_
,这样<mark>64个字符均不是转义字符</mark>。(自定义编码集)
这样我们就可以把二进制图片转换为base64编码格式,放在 html 文本中。
# 编码流程
下面,看看二进制是如何转为 base64 的。
- 对二进制数据进行处理,每3个字节一组(
b1
b2
b2
),一共是3x8=24bit,划为4组(n1
n2
n3
n4
),每组正好6个bit:
我们知道,<mark>6bit大小的二进制数转换回十进制,范围是0~64</mark>
<mark>这样,我们就可以把每个6bit二进制数和base64编码表一一对应起来了!</mark>
# 处理流程
- 将所有字符转化为ASCII码;
如:A ⇒ 65 - 将ASCII码转化为8位二进制;
如:65 ⇒0100 0001
- 将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位;
如:0100 0001
⇒0100 0001 0000 0000 0000 0000
(<mark>补两个八位的0</mark>)
⇒010000
、010000
、000000
、000000
- 统一在6位二进制前补两个0凑足8位;
如:010000
、010000
、000000
、000000
⇒00010000
、00010000
、00000000
、00000000
- 将补0后的二进制转为十进制;
如:00010000
、00010000
、00000000
、00000000
⇒ 16、16 、0、0 - 从Base64编码表获取十进制对应的Base64编码;
如: 16、16 、0、0
⇒ Q、Q 、0、0
细节:
- 转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
- 数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
- 不断进行,直到全部输入数据转换完成。
- 如果最后剩下两个输入数据,在编码结果后加1个“=”;
- 如果最后剩下一个输入数据,编码结果后加2个“=”;
- 如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
<mark>因为前面补了两个八位的0</mark>
所以最后输出:QQ==
# 说明
-
Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。
-
Base64是一种通过查表的编码方法,不能用于加密,即使使用自定义的编码表也不行。