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>

# 处理流程

  1. 将所有字符转化为ASCII码;
    如:A ⇒ 65
  2. 将ASCII码转化为8位二进制;
    如:65 ⇒ 0100 0001
  3. 将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位;
    如:0100 00010100 0001 0000 0000 0000 0000 (<mark>补两个八位的0</mark>)
    010000010000000000000000
  4. 统一在6位二进制前补两个0凑足8位;
    如: 010000010000000000000000
    00010000000100000000000000000000
  5. 将补0后的二进制转为十进制;
    如: 00010000000100000000000000000000
    ⇒ 16、16 、0、0
  6. 从Base64编码表获取十进制对应的Base64编码;
    如: 16、16 、0、0
    ⇒ Q、Q 、0、0

细节:

  1. 转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
  2. 数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
  3. 不断进行,直到全部输入数据转换完成。
  4. 如果最后剩下两个输入数据,在编码结果后加1个“=”;
  5. 如果最后剩下一个输入数据,编码结果后加2个“=”;
  6. 如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。

<mark>因为前面补了两个八位的0</mark>

所以最后输出:QQ==

# 说明

  • Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。

  • Base64是一种通过查表的编码方法,不能用于加密,即使使用自定义的编码表也不行。