Base64 是一种编码方法,用于将二进制数据(如图像、音频、文件等)编码为 ASCII 字符串。这种编码方式将数据转换为一组可打印字符,通常用于在需要文本数据的环境中传输二进制数据,例如在电子邮件、JSON 数据、XML 数据等场景中。Base64 编码原理如下:
1. 编码过程
1.1 数据分组
- Base64 编码将输入数据按每 3 个字节(24 位)一组进行分组。
- 每个 3 字节的数据块由 24 位二进制数据组成,相当于 3 * 8 = 24 位。
1.2 分割与映射
-
将这 24 位的二进制数据分成 4 组,每组 6 位。即:24 位 / 6 位 = 4 组。
-
每组 6 位的二进制数据被映射到一个 Base64 字符集中的字符。Base64 字符集共有 64 个字符,这些字符包括:
- 大写字母:A-Z
- 小写字母:a-z
- 数字:0-9
- 特殊字符:
+
和/
例如,字符集的第一个字符是 ‘A’,它代表 6 位二进制数
000000
,字符集的最后一个字符是 ’/‘,它代表 6 位二进制数111111
。
1.3 填充
- 如果输入数据的字节数不是 3 的倍数,Base64 编码会在编码的结果末尾添加
=
作为填充符号,以保证编码后的字符数是 4 的倍数。 =
表示填充的字节数:- 一个
=
表示编码过程中缺少 1 个字节。 - 两个
=
表示编码过程中缺少 2 个字节。
- 一个
2. 解码过程
解码过程是编码过程的反向操作:
2.1 反向映射
- 将 Base64 字符串中的每个字符映射回 6 位的二进制数据。
- 使用 Base64 字符集的索引将字符转换为 6 位的二进制数。
2.2 合并与分组
- 将所有 6 位的二进制数据重新组合为 24 位的二进制数据块。
- 将 24 位数据块拆分为 3 个字节(24 位 / 8 位 = 3 字节)。
2.3 去除填充
- 移除解码过程中添加的填充符号
=
,恢复原始数据的字节。
示例
编码示例
将字符串 “hello” 编码为 Base64:
-
转换为二进制:
h
=01101000
e
=01100101
l
=01101100
l
=01101100
o
=01101111
合并为:
01101000 01100101 01101100 01101100 01101111
-
分组:
- 24 位块 1:
01101000 01100101 01101100
(011010
、000110
、010101
、101100
) - 24 位块 2:
01101100 01101111
(011011
、000110
、111100
)
- 24 位块 1:
-
映射到 Base64 字符集:
011010
->a
000110
->G
010101
->V
101100
->s
011011
->b
000110
->G
111100
->8
Base64 编码结果为
aGVsbG8=
解码示例
将 Base64 字符串 aGVsbG8=
解码:
-
映射回二进制:
a
->011010
G
->000110
V
->010101
s
->101100
b
->011011
G
->000110
8
->111100
-
合并和恢复:
- 合并为:
01101000 01100101 01101100 01101100 01101111
- 合并为:
-
转换为原始字符串:
01101000
->h
01100101
->e
01101100
->l
01101100
->l
01101111
->o
原始字符串为 “hello”