TOC

Base64

原理

Base64

A-Z a-z 0-9 + /, 26 * 2 + 10 + 2 一共 64 个字符,也就是正好六位二进制数。

6:8 = 3:4, 每 3 个字节用 4 个符号表示,会出现两种对不齐的情况:

  1. 如果最后还剩 1 个字节 (8bits),前面 6bits 编码转换成一个字符,多 2bits,转换时后面补 4 个 0,用 == 表示
  2. 如果最后还剩 2 个字节 (16bits),前面 12bits 编码转换成两个字符,多 4bits,转换时后面补 2 个 0,用 = 表示

示例

一段数据,比如说 hello world, 一共 11 个字节,直接拿来,二进制表示:

bin       dec  hex  char
--------  ---  ---  ----
01101000  104   68     h
01100101  101   65     e
01101100  108   6c     l
01101100  108   6c     l
01101111  111   6f     o
00100000   32   20
01110111  119   77     w
01101111  111   6f     o
01110010  114   72     r
01101100  108   6c     l
01100100  100   64     d

按六位一个的话就是(PS: 后方须补两个 0: 8 x 11 = 88 = 6 x 15 - 2):

bin     dec  hex  b64
------  ---  --- ----
011010   26   1a    a
000110    6   06    G
010101   21   15    V
101100   44   2c    s
011011   27   1b    b
000110    6   06    G
111100   60   3c    8
100000   32   20    g
011101   29   1d    d
110110   54   36    2
111101   61   3d    9
110010   50   32    y
011011   27   1b    b
000110    6   06    G
010000   16   10    Q

由于补了两位,加一个等于号,所以就是:
aGVsbG8gd29ybGQ=

验证

echo -n 'hello world' | base64
aGVsbG8gd29ybGQ=

应用与变种

MIME 规范采用标准的 Base64 编码

uuencode: 早于 Base64, 和 btoa 的做法很相似,不过是采用 64 个字符, ASCII 32 - 95。
别的规则: 分行, 每行第一个字符代表行长度,有效负载最多 60 个字符,然后换行。