跳到主要内容

4. Base 64 编码

以下对 Base 64 的描述源自 [3]、[4]、[5] 与 [6]。这种编码可称为 "base64"。

Base 64 编码旨在以某种形式表示任意的八位组序列,该形式允许同时使用大小写字母,但无需具备人类可读性。

使用 US-ASCII 的一个 65 字符子集,使得每个可打印字符可表示 6 位。(第 65 个字符 "=" 用于表示特殊的处理功能。)

编码过程将输入比特的 24 位分组表示为 4 个编码字符组成的输出字符串。从左到右进行,通过将 3 个 8 位输入分组拼接起来形成 24 位输入组。然后将这 24 位视为 4 个拼接的 6 位分组,每个 6 位分组被转换为 Base 64 字母表中的一个字符。

每个 6 位分组被用作包含 64 个可打印字符的数组的索引。该索引所引用的字符被放入输出字符串中。

表 1:Base 64 字母表​

值   编码   值   编码   值   编码   值   编码
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (填充) =
15 P 32 g 49 x
16 Q 33 h 50 y

当被编码数据末尾不足 24 位时,将执行特殊处理。一个完整的编码量子总是在一个数据块的末尾完成。当输入组中可用的输入比特不足 24 位时,会在右侧添加值为零的比特,以形成整数个 6 位分组。数据末尾的填充使用 '=' 字符完成。由于所有 Base 64 输入都是整数个八位组,因此只会出现以下情况:

(1) 编码输入的最终量子是 24 位的整数倍;此时编码输出的最终单元是 4 个字符的整数倍,没有 "=" 填充。

(2) 编码输入的最终量子恰好为 8 位;此时编码输出的最终单元是两个字符后跟两个 "=" 填充字符。

(3) 编码输入的最终量子恰好为 16 位;此时编码输出的最终单元是三个字符后跟一个 "=" 填充字符。