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解碼,就是把上面的過程逆著來一遍即可。
|