Base 编码家族

Base64

Base64,顾名思义是一种基于 64 个可打印字符来表示二进制数据的表示方法,这 64 个字符分别为 A-Za-z0-9 以及 +/。64 个字符可用 6 个比特位表示,3 个字节有 24 个比特位,对应于 4 个 Base64 单元,所以编码后的数据要比原始数据略长,为原来的 4/3。Base64 索引表如下所示:

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

编码 Hello 的过程如下:

文本 H e l l o
ASCII 编码 72 101 108 108 111
二进制位 ‭01001000‬ ‭01100101‬ ‭01101100‬ ‭01101100‬ ‭01101111‬ 00000000

以6个二进制位进行编码:

二进制位 010010 000110 010101 101100 011011 000110 111100 000000
索引 18 6 21 44 27 6 60
Base64 编码 S G V s b G 8 =

若原数据不是 3 的倍数,且多出 1 个字节,则在编码末尾加 2 个 =,多出 2 个字节,则在编码末尾加 1 个 =。换言之,若多出 1 个字节,则最后一个 6 位的 Base64 字节块有 4 位是 0 值,若多出 2 个字节,则最后一个 6 位的 Base64 字节块有 2 位是 0 值。

Base32

与上类似,Base32 基于 32 个可打印字符,分别为 A-Z 以及 2-7。32 个字符可用 5 个比特位表示,5 个字节有 40 个比特位,对应于 8 个 Base32 单元,编码后的数据比原始数据略长 8/5。若原数据不是 5 的倍数,且多出 1 个字节,则在编码末尾加 4 个 =,多出 2 个字节,则在编码末尾加 3 个 =,多出 3 个字节,则在编码末尾加 2 个 =,多出 4 个字节,则在编码末尾加 1 个 =。Base32 索引表如下所示:

数值 字符 数值 字符 数值 字符 数值 字符
0 A 8 I 16 Q 24 Y
1 B 9 J 17 R 25 Z
2 C 10 K 18 S 26 2
3 D 11 L 19 T 27 3
4 E 12 M 20 U 28 4
5 F 13 N 21 V 29 5
6 G 14 O 22 W 30 6
7 H 15 P 23 X 31 7

Base16

与上类似,Base16 基于 16 个可打印字符,分别为 0-9 以及 A-F。16 个字符可用 4 个比特位表示,1 个字节有 8 个比特位,对应于 2 个 Base16 单元,编码后的数据比原始数据略长 2。显然,在 Base16 中不需要在末尾填充 =。Base16 索引表如下所示:

数值 字符 数值 字符 数值 字符 数值 字符
0 0 4 4 8 8 12 C
1 1 5 5 9 9 13 D
2 2 6 6 10 A 14 E
3 3 7 7 11 B 15 F

Base64URL

Base64URL 编码是在 Base64 编码的结果的基础上做的一些修改,主要是为了方便编码后的字符串在网络中传输。其做的修改如下:

  1. 去除尾部的 =
  2. + 替换成 -
  3. / 替换成 _

类似的,解码为原 Base64 编码结果,遵循如下步骤:

  1. - 替换成 +
  2. _ 替换成 /
  3. 计算 Base64URL 编码长度 % 4 的值:
    a. 结果为 0,不做处理
    b. 结果为 2,字符串添加 ==
    c. 结果为 3,字符串添加 =

XXencode

XXencode 不属于 Base 编码家族,但与 Base64 编码极为类似,区别仅在于 64 个可打印字符及其顺序,XXencode 使用的为 +-0-9A-Za-z

UUencode

UUencode 也与 Base64 极为类似,它使用的字符及其顺序为 (space)!"#$%&'()*+,-./0-9:;<=>?@A-Z[\]^_、`。