Base 编码家族
Base64
Base64,顾名思义是一种基于 64 个可打印字符来表示二进制数据的表示方法,这 64 个字符分别为 A-Z
、a-z
、0-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 编码的结果的基础上做的一些修改,主要是为了方便编码后的字符串在网络中传输。其做的修改如下:
- 去除尾部的
=
- 将
+
替换成-
- 将
/
替换成_
类似的,解码为原 Base64 编码结果,遵循如下步骤:
- 将
-
替换成+
- 将
_
替换成/
- 计算
Base64URL 编码长度 % 4
的值:
a. 结果为 0,不做处理
b. 结果为 2,字符串添加==
c. 结果为 3,字符串添加=
XXencode
XXencode 不属于 Base 编码家族,但与 Base64 编码极为类似,区别仅在于 64 个可打印字符及其顺序,XXencode 使用的为 +
、-
、0-9
、A-Z
、a-z
。
UUencode
UUencode 也与 Base64 极为类似,它使用的字符及其顺序为 (space)
、!
、"
、#
、$
、%
、&
、'
、(
、)
、*
、+
、,
、-
、.
、/
、0-9
、:
、;
、<
、=
、>
、?
、@
、A-Z
、[
、\
、]
、^
、_
、`。