Base64編碼原理

1、Base64編碼原理

下圖為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字符的過程。
  • 解碼:由字符轉(zhuǎn)化為二進(jìn)制的過程,所謂Base64解碼就是將Base64字符轉(zhuǎn)到二進(jìn)制的過程。

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è)普通字符,普通字符通過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ǔ)充的,在原始字符中并沒有對(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ī)則對(duì)其進(jìn)行解碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容