原理
A-Z a-z 0-9 + /
, 26 * 2 + 10 + 2
一共 64 个字符,也就是正好六位二进制数。
6:8 = 3:4, 每 3 个字节用 4 个符号表示,会出现两种对不齐的情况:
- 如果最后还剩 1 个字节 (8bits),前面 6bits 编码转换成一个字符,多 2bits,转换时后面补 4 个 0,用
==
表示 - 如果最后还剩 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 个字符,然后换行。
UrlsafeBase64: 采用 -
替换 +
,采用 _
替换 /
,去掉末尾的 =
。