Base64编码方法要求把每三个8Bit的字节转换为四个6Bit的字节,其中,转换之后的这四个字节中每6个有效bit为是有效数据,空余的那两个bit用0补上成为一个字节。因此Base64所造成数据冗余还是比较严重的,采用这中编码方法会使得编码后的数据长度变成编码前长度的三分之四倍。但是,Base64是当今比较流行的编码方法,因为它编起来“速度快而且简单”,这是网上的说法,我更觉得它是历史遗留下来的原因。
举个例子,有三个字节的原始数据:aaaaaabb bbbbccccc ccdddddd(这里每个字母表示一个bit位)
那么编码之后会变成: 00aaaaaa 00bbbbbb 00cccccc 00dddddd
上面的例子只是说明了Base64的移位方式,因为我语言表达能力较差,唯恐造成误解,故举此例。
这还没完,读者现在只是了解了Base64编码方法的一部分,还有一个Base64编码表需要了解,编码表是这样的:
编号 |
字符 |
编号 |
字符 |
编号 |
字符 |
编号 |
字符 |
编号 |
字符l |
0 |
A |
16 |
Q |
32 |
g |
48 |
w |
(pad) |
= |
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 |
/ |
|
|
现在先别管上面这个表,在知道了移位方式之后,请再看个例子。
有三个字节的原始数据:10101101 10111010 01110110
编码之后的数据是: 00101011 00011011 00101001 00110110 (还是数字看起来比较整齐~)
编码之后的这四个字节都转换成为十进制数是:
43 27 42 54
现在用这四个数去上面那个编码表里找,找到的字符是r b q 2,于是乎,三个字节的原始数据:10101101 10111010 01110110经Base64编码方法编码之后的结果是rbq2。
还有很重要的一点要说明,如果原文的字节数量如果不是3的倍数,不够的地方可以用全0来补足来凑成6位一组的字节。如前面所述,Base64编码方法要求把每三个8Bit的字节转换为四个6Bit的字节,所以当转换后的字节数不4的倍数时,就要使用“=”来补足,因为编码前的一个字节只少可以对应编码后的二个字节,一个正确Base64编码最多只会有两个“=”。所以对于Base64解码,就是把上面的过程逆着来一遍即可。
|