1竭恬、Base64編碼原理
下圖為Base64編碼索引表:
字符選用了"A-Z战坤、a-z、0-9向图、+枢希、/" 64個(gè)可打印字符桌吃。數(shù)值代表字符的索引,這個(gè)是標(biāo)準(zhǔn)Base64協(xié)議規(guī)定的苞轿,不能更改茅诱。
2、關(guān)于編碼和解碼
- 編碼:由二進(jìn)制轉(zhuǎn)到字符成為Base64編碼搬卒,所謂Base64編碼就是將所有二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為Base64字符的過(guò)程瑟俭。
- 解碼:由字符轉(zhuǎn)化為二進(jìn)制的過(guò)程,所謂Base64解碼就是將Base64字符轉(zhuǎn)到二進(jìn)制的過(guò)程契邀。
3摆寄、關(guān)于ASCII碼表
下圖為國(guó)際上標(biāo)準(zhǔn)的ASCII碼表:
我們知道所有的可打印字符都有其對(duì)應(yīng)的ASCII碼,如“M”對(duì)應(yīng)的ASCII碼為01001101坯门,字符“z”對(duì)應(yīng)的ASCII碼為01111010微饥,我們知道,Base64字符最多能表示6bit(2^6=64)古戴,而一個(gè)字符占一個(gè)字節(jié)(8bit)欠橘,所以3個(gè)字符可用Base64的4個(gè)字符表示(6和8的最小公倍數(shù)為24),所以對(duì)于一個(gè)字符串來(lái)講现恼,每次進(jìn)行Base64編碼時(shí)肃续,都是已三個(gè)字節(jié)為單位進(jìn)行轉(zhuǎn)換(三個(gè)字節(jié)恰好可以用4個(gè)Base64字符表示),對(duì)于不夠三個(gè)字節(jié)的情況述暂,即當(dāng)一個(gè)字符串的長(zhǎng)度對(duì)3取余的余數(shù)為1或者2時(shí)痹升,可以用兩個(gè)Base64字符表示一個(gè)普通字符,或者用三個(gè)Base64字符表示兩個(gè)普通字符畦韭,普通字符通過(guò)ASCII碼轉(zhuǎn)換為二進(jìn)制時(shí)疼蛾,為8bit,而兩個(gè)Base64字符轉(zhuǎn)換為二進(jìn)制時(shí)為12bit,如何轉(zhuǎn)換呢艺配?根據(jù)規(guī)則察郁,需要在普通字符的二進(jìn)制表示的末尾用0補(bǔ)齊12bit之后衍慎,再進(jìn)行Base64字符的轉(zhuǎn)換,字符串的轉(zhuǎn)換規(guī)則為:先將普通字符串參照ASCII碼表全部轉(zhuǎn)換為二進(jìn)制皮钠,從左到右稳捆,每3個(gè)字節(jié)為一組進(jìn)行轉(zhuǎn)換,每3個(gè)字節(jié)(3個(gè)普通字符)對(duì)應(yīng)4個(gè)Base64字符麦轰,對(duì)于末尾剩余一個(gè)8bit(剩余一個(gè)字符)的情況乔夯,可以用2個(gè)Base64字符表示,需在其末尾用0填充補(bǔ)齊12個(gè)bit款侵,再將這12個(gè)bit位用兩個(gè)Base64字符表示末荐,對(duì)于末尾剩余16bit(剩余兩個(gè)普通字符)的情況,可以用3個(gè)Base64字符表示新锈,需在其末尾用0補(bǔ)齊18個(gè)bit,再將這12個(gè)bit位用兩個(gè)Base64字符表示,因?yàn)锽ase64字符的最小單位是4個(gè)字符一組甲脏,在轉(zhuǎn)換后,如果Base64編碼字符串的長(zhǎng)度不是4的倍數(shù)妹笆,需在在字符串后面用“=”號(hào)填充块请,所以Base64字符串只可能在最后出現(xiàn)一個(gè)或者兩個(gè)“=”號(hào),不可能在中間出現(xiàn)“=”號(hào)拳缠,也不可能出現(xiàn)3個(gè)“=”號(hào)的情況墩新。
4、一個(gè)例子
注:圖表中藍(lán)色背景的二進(jìn)制0值是額外補(bǔ)充的
Hello!! Base64編碼的結(jié)果為 SGVsbG8hIQAA 窟坐。最后2個(gè)零值只是為了Base64編碼而補(bǔ)充的抖棘,在原始字符中并沒(méi)有對(duì)應(yīng)的字符,那么Base64編碼結(jié)果中的最后兩個(gè)字符 AA 實(shí)際不帶有效信息狸涌,所以需要特殊處理,以免解碼錯(cuò)誤最岗。
標(biāo)準(zhǔn)Base64編碼通常用 = 字符來(lái)替換最后的 A帕胆,即編碼結(jié)果為 SGVsbG8hIQ==。因?yàn)?= 字符并不在Base64編碼索引表中般渡,其意義在于結(jié)束符號(hào)懒豹,在Base64解碼時(shí)遇到 = 時(shí)即可知道一個(gè)Base64編碼字符串結(jié)束。
5驯用、應(yīng)用
Base64編碼本質(zhì)上是一種將二進(jìn)制數(shù)據(jù)轉(zhuǎn)成文本數(shù)據(jù)的方案脸秽。對(duì)于非二進(jìn)制數(shù)據(jù),是先將其轉(zhuǎn)換成二進(jìn)制形式蝴乔,然后每連續(xù)6比特(2的6次方=64)計(jì)算其十進(jìn)制值记餐,根據(jù)該值在上面的索引表中找到對(duì)應(yīng)的字符,最終得到一個(gè)文本字符串薇正。Base64編碼主要用在傳輸片酝、存儲(chǔ)囚衔、表示二進(jìn)制等領(lǐng)域,還可以用作簡(jiǎn)單的加密雕沿,但只是一眼看上去不知道什么內(nèi)容罷了练湿,但可通過(guò)其編碼規(guī)則對(duì)其進(jìn)行解碼。