Base64

一. Base64編碼由來(lái)

為什么會(huì)有Base64編碼呢?因?yàn)橛行┚W(wǎng)絡(luò)傳送渠道并不支持所有的字節(jié),例如傳統(tǒng)的郵件只支持可見(jiàn)字符的傳送,像ASCII碼的控制字符就 不能通過(guò)郵件傳送。這樣用途就受到了很大的限制,比如圖片二進(jìn)制流的每個(gè)字節(jié)不可能全部是可見(jiàn)字符,所以就傳送不了。最好的方法就是在不改變傳統(tǒng)協(xié)議的情 況下,做一種擴(kuò)展方案來(lái)支持二進(jìn)制文件的傳送。把不可打印的字符也能用可打印字符來(lái)表示,問(wèn)題就解決了。Base64編碼應(yīng)運(yùn)而生,Base64就是一種 基于64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的表示方法。

二. Base64編碼原理

看一下Base64的索引表,字符選用了"A-Z、a-z、0-9、+、/" 64個(gè)可打印字符。數(shù)值代表字符的索引,這個(gè)是標(biāo)準(zhǔn)Base64協(xié)議規(guī)定的,不能更改。64個(gè)字符用6個(gè)bit位就可以全部表示,一個(gè)字節(jié)有8個(gè)bit 位,剩下兩個(gè)bit就浪費(fèi)掉了,這樣就不得不犧牲一部分空間了。這里需要弄明白的就是一個(gè)Base64字符是8個(gè)bit,但是有效部分只有右邊的6個(gè) bit,左邊兩個(gè)永遠(yuǎn)是0。

Paste_Image.png

那么怎么用6個(gè)有效bit來(lái)表示傳統(tǒng)字符的8個(gè)bit呢?8和6的最小公倍數(shù) 是24,也就是說(shuō)3個(gè)傳統(tǒng)字節(jié)可以由4個(gè)Base64字符來(lái)表示,保證有效位數(shù)是一樣的,這樣就多了1/3的字節(jié)數(shù)來(lái)彌補(bǔ)Base64只有6個(gè)有效bit 的不足。你也可以說(shuō)用兩個(gè)Base64字符也能表示一個(gè)傳統(tǒng)字符,但是采用最小公倍數(shù)的方案其實(shí)是最減少浪費(fèi)的。結(jié)合下邊的圖比較容易理解。Man是三個(gè) 字符,一共24個(gè)有效bit,只好用4個(gè)Base64字符來(lái)湊齊24個(gè)有效位。紅框表示的是對(duì)應(yīng)的Base64,6個(gè)有效位轉(zhuǎn)化成相應(yīng)的索引值再對(duì)應(yīng) Base64字符表,查出"Man"對(duì)應(yīng)的Base64字符是"TWFU"。說(shuō)到這里有個(gè)原則不知道你發(fā)現(xiàn)了沒(méi)有,要轉(zhuǎn)換成Base64的最小單位就是三個(gè)字節(jié),對(duì)一個(gè)字符串來(lái)說(shuō)每次都是三個(gè)字節(jié)三個(gè)字節(jié)的轉(zhuǎn)換,對(duì)應(yīng)的是Base64的四個(gè)字節(jié)。這個(gè)搞清楚了其實(shí)就差不多了。

Paste_Image.png
Paste_Image.png

但是轉(zhuǎn)換到最后你發(fā)現(xiàn)不夠三個(gè)字節(jié)了怎么辦呢?愿望終于實(shí)現(xiàn)了,我們可以用兩 個(gè)Base64來(lái)表示一個(gè)字符或用三個(gè)Base64表示兩個(gè)字符,像下圖的A對(duì)應(yīng)的第二個(gè)Base64的二進(jìn)制位只有兩個(gè),把后邊的四個(gè)補(bǔ)0就是了。所以 A對(duì)應(yīng)的Base64字符就是QQ。上邊已經(jīng)說(shuō)過(guò)了,原則是Base64字符的最小單位是四個(gè)字符一組,那這才兩個(gè) 字 符,后邊補(bǔ)兩個(gè)"="吧。其實(shí)不用"="也不耽誤解碼,之所以用"=",可能是考慮到多段編碼后的Base64字符串拼起來(lái)也不會(huì)引起混淆。由此可見(jiàn) Base64字符串只可能最后出現(xiàn)一個(gè)或兩個(gè)"=",中間是不可能出現(xiàn)"="的。下圖中字符"BC"的編碼過(guò)程也是一樣的。

Paste_Image.png

三. 總結(jié)

說(shuō)起B(yǎng)ase64編碼可能有些奇怪,因?yàn)榇蠖鄶?shù)的編碼都是由字符轉(zhuǎn)化成二進(jìn)制的過(guò)程,而從二進(jìn)制轉(zhuǎn)成字符的過(guò)程稱為解碼。而B(niǎo)ase64的概念就恰好反了,由二進(jìn)制轉(zhuǎn)到字符稱為編碼,由字符到二進(jìn)制稱為解碼。
  Base64編碼主要用在傳輸、存儲(chǔ)、表示二進(jìn)制等領(lǐng)域,還可以用來(lái)加密,但是這種加密比較簡(jiǎn)單,只是一眼看上去不知道什么內(nèi)容罷了,當(dāng)然也可以對(duì)Base64的字符序列進(jìn)行定制來(lái)進(jìn)行加密。
  Base64編碼是從二進(jìn)制到字符的過(guò)程,像一些中文字符用不同的編碼轉(zhuǎn)為二 進(jìn)制時(shí),產(chǎn)生的二進(jìn)制是不一樣的,所以最終產(chǎn)生的Base64字符也不一樣。例如"上網(wǎng)"對(duì)應(yīng)utf-8格式的Base64編碼是"5LiK572R", 對(duì)應(yīng)GB2312格式的Base64編碼是"yc/N+A=="

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近學(xué)Python的時(shí)候遇到了編碼問(wèn)題,順帶了解了一下base64編碼,首先閱讀了咱CSDN上的一篇文章Base6...
    連命都給你了閱讀 952評(píng)論 0 3
  • Base64編碼由來(lái) Base64最早是用來(lái)解決電子郵件的傳輸問(wèn)題。 傳統(tǒng)的電子郵件是1982年定下技術(shù)規(guī)范的,詳...
    Ashton閱讀 2,710評(píng)論 0 6
  • 1. 什么是Base64 Base64是一種基于64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的表示方法 Base64是一種編碼...
    理查德成閱讀 3,057評(píng)論 0 2
  • 1、Base64編碼原理 下圖為Base64編碼索引表: 字符選用了"A-Z、a-z、0-9、+、/" 64個(gè)可打...
    M_JCs閱讀 1,878評(píng)論 1 9
  • 版本記錄 前言 在這個(gè)信息爆炸的年代,特別是一些敏感的行業(yè),比如金融業(yè)和銀行卡相關(guān)等等,這都對(duì)app的安全機(jī)制有更...
    刀客傳奇閱讀 2,589評(píng)論 0 1

友情鏈接更多精彩內(nèi)容