Base64編碼方法要求把每三個(gè)8Bit的字節(jié)轉(zhuǎn)換為四個(gè)6Bit的字節(jié),其中,轉(zhuǎn)換之后的這四個(gè)字節(jié)中每6個(gè)有效bit為是有效數(shù)據(jù),空余的那兩個(gè)bit用0補(bǔ)上成為一個(gè)字節(jié)。因此Base64所造成數(shù)據(jù)冗余還是比較嚴(yán)重的,采用這中編碼方法會(huì)使得編碼后的數(shù)據(jù)長度變成編碼前長度的三分之四倍。但是,Base64是當(dāng)今比較流行的編碼方法,因?yàn)樗幤饋?#8220;速度快而且簡單”,這是網(wǎng)上的說法,我更覺得它是歷史遺留下來的原因。
舉個(gè)例子,有三個(gè)字節(jié)的原始數(shù)據(jù):aaaaaabb bbbbccccc ccdddddd(這里每個(gè)字母表示一個(gè)bit位)
那么編碼之后會(huì)變成: 00aaaaaa 00bbbbbb 00cccccc 00dddddd
上面的例子只是說明了Base64的移位方式,因?yàn)槲艺Z言表達(dá)能力較差,唯恐造成誤解,故舉此例。
這還沒完,讀者現(xiàn)在只是了解了Base64編碼方法的一部分,還有一個(gè)Base64編碼表需要了解,編碼表是這樣的:
編號(hào) |
字符 |
編號(hào) |
字符 |
編號(hào) |
字符 |
編號(hào) |
字符 |
編號(hào) |
字符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 |
/ |
|
|
現(xiàn)在先別管上面這個(gè)表,在知道了移位方式之后,請(qǐng)?jiān)倏磦€(gè)例子。
有三個(gè)字節(jié)的原始數(shù)據(jù):10101101 10111010 01110110
編碼之后的數(shù)據(jù)是: 00101011 00011011 00101001 00110110 (還是數(shù)字看起來比較整齊~)
編碼之后的這四個(gè)字節(jié)都轉(zhuǎn)換成為十進(jìn)制數(shù)是:
43 27 42 54
現(xiàn)在用這四個(gè)數(shù)去上面那個(gè)編碼表里找,找到的字符是r b q 2,于是乎,三個(gè)字節(jié)的原始數(shù)據(jù):10101101 10111010 01110110經(jīng)Base64編碼方法編碼之后的結(jié)果是rbq2。
還有很重要的一點(diǎn)要說明,如果原文的字節(jié)數(shù)量如果不是3的倍數(shù),不夠的地方可以用全0來補(bǔ)足來湊成6位一組的字節(jié)。如前面所述,Base64編碼方法要求把每三個(gè)8Bit的字節(jié)轉(zhuǎn)換為四個(gè)6Bit的字節(jié),所以當(dāng)轉(zhuǎn)換后的字節(jié)數(shù)不4的倍數(shù)時(shí),就要使用“=”來補(bǔ)足,因?yàn)榫幋a前的一個(gè)字節(jié)只少可以對(duì)應(yīng)編碼后的二個(gè)字節(jié),一個(gè)正確Base64編碼最多只會(huì)有兩個(gè)“=”。所以對(duì)于Base64解碼,就是把上面的過程逆著來一遍即可。
|