1. Base64 基本介绍
Base64 (基底64)这个术语源自 MIME 的 Content-Transfer-Encoding1,它是一种基于 64 个可打印字符来表示二进制数据的方法。
因为 $\log_2{64}=6$,所以 Base64 编码每 6 个比特位为 1 个单元,换句话说,Base64 编码将每 3 字节(24 位)转换为 4 个 6 位的字符。
Base64 只是进行了编码,方便数据的传输,并不是加密。
Base64 可打印字符包括大写字母 A-Z
、小写字母 a-z
、数字 0-9
,这样就有 62 个字符了,另外两个字符可能略有不同,通常采用 MIME 中的方式,也就是选择斜杆 /
和加号 +
,这样共 64 个字符,并将等号 =
作为后缀填充。
在 URL 中使用标准 Base64 编码时1会将 +
、/
和 =
字符进行 URL 编码,导致 +
变为 %2B
、/
变为 %2F
和 =
变为 %3D
,使得字符串变得冗长。为此,有专门针对 URL 的 Base64编码,它将标准 Base64 编码的 +
和 /
字符分别替换为 -
和 _
,从而避免对一些特殊字符进行 URL 编码/解码。
下表为标准 Base64 编码的字符集
Index |
Binary |
Char |
|
Index |
Binary |
Char |
|
Index |
Binary |
Char |
|
Index |
Binary |
Char |
0 |
000000 |
A |
|
16 |
010000 |
Q |
|
32 |
100000 |
g |
|
48 |
110000 |
w |
1 |
000001 |
B |
|
17 |
010001 |
R |
|
33 |
100001 |
h |
|
49 |
110001 |
x |
2 |
000010 |
C |
|
18 |
010010 |
S |
|
34 |
100010 |
i |
|
50 |
110010 |
y |
3 |
000011 |
D |
|
19 |
010011 |
T |
|
35 |
100011 |
j |
|
51 |
110011 |
z |
4 |
000100 |
E |
|
20 |
010100 |
U |
|
36 |
100100 |
k |
|
52 |
110100 |
0 |
5 |
000101 |
F |
|
21 |
010101 |
V |
|
37 |
100101 |
l |
|
53 |
110101 |
1 |
6 |
000110 |
G |
|
22 |
010110 |
W |
|
38 |
100110 |
m |
|
54 |
110110 |
2 |
7 |
000111 |
H |
|
23 |
010111 |
X |
|
39 |
100111 |
n |
|
55 |
110111 |
3 |
8 |
001000 |
I |
|
24 |
011000 |
Y |
|
40 |
101000 |
o |
|
56 |
111000 |
4 |
9 |
001001 |
J |
|
25 |
011001 |
Z |
|
41 |
101001 |
p |
|
57 |
111001 |
5 |
10 |
001010 |
K |
|
26 |
011010 |
a |
|
42 |
101010 |
q |
|
58 |
111010 |
6 |
11 |
001011 |
L |
|
27 |
011011 |
b |
|
43 |
101011 |
r |
|
59 |
111011 |
7 |
12 |
001100 |
M |
|
28 |
011100 |
c |
|
44 |
101100 |
s |
|
60 |
111100 |
8 |
13 |
001101 |
N |
|
29 |
011101 |
d |
|
45 |
101101 |
t |
|
61 |
111101 |
9 |
14 |
001110 |
O |
|
30 |
011110 |
e |
|
46 |
101110 |
u |
|
62 |
111110 |
+ |
15 |
001111 |
P |
|
31 |
011111 |
f |
|
47 |
101111 |
v |
|
63 |
111111 |
/ |
Padding |
= |
|
|
|
|
|
|
|
|
|
|
|
|
2. Base64 编码过程
Base64 编码的步骤大致如下:
(1)将每个字符转换成二进制,合并得到一个二进制串,如果长度不能被 6 整除,需要进行填充;
(2)将二进制串按 6 位一组划分,根据 Base64 字符集进行编码;
(3)Base64 编码后的字符长度不是 4 的倍数时,用一个或两个 =
进行填充。
以 Man
的 Base64 编码结果 TWFu
为例,其转换过程如下所示
