Base64編碼

????????Base64是一種基于64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的表示方法剩失。它已經(jīng)成為網(wǎng)絡(luò)上常見(jiàn)的傳輸8Bit字節(jié)代碼的編碼方式之一。

????????我們都知道ASCII字符集由95個(gè)可打印字符(0x20-0x7E)和33個(gè)控制字符(0x00-0x1F政模,0x7F)組成⌒瓮ィ可打印字符可顯示在輸出設(shè)備上,例如熒屏或者打印紙上而控制字符沒(méi)法打印出來(lái)萌踱,但是每個(gè)字符,都對(duì)應(yīng)著一個(gè)特殊的控制功能的字符号阿,因此這些字符簡(jiǎn)稱(chēng)功能字符或功能碼?Function Code?并鸵。如用記事本打開(kāi)exe、jpg扔涧、pdf這些文件時(shí)园担,我們都會(huì)看到一大堆亂碼,因?yàn)槎M(jìn)制文件包含很多無(wú)法顯示和打印的字符枯夜,所以如果要讓記事本這樣的文本處理軟件能處理二進(jìn)制數(shù)據(jù)弯汰,就需要一個(gè)二進(jìn)制到字符串的轉(zhuǎn)換方法。

Base64編碼原理

????????Base64協(xié)議選用了”A-Z湖雹、a-z咏闪、0-9、+劝枣、/” 64個(gè)可打印字符構(gòu)成了Base64的索引表汤踏,如下


? ??????數(shù)值代表字符的索引,這個(gè)是標(biāo)準(zhǔn)Base64協(xié)議規(guī)定的舔腾,不能更改溪胶。

????Base64的碼表只有64個(gè)字符,如果要表達(dá)64個(gè)字符的話(huà)稳诚,使用6的bit即可完全表示(2的6次方為64)哗脖。

????因?yàn)锽ase64的編碼只有6個(gè)bit即可表示,而正常的字符是使用8個(gè)bit表示扳还, 8和6的最小公倍數(shù)是24才避,所以4個(gè)Base64字符可以表示3個(gè)標(biāo)準(zhǔn)的ascll字符。如果是字符串轉(zhuǎn)換為Base64碼氨距,會(huì)先把對(duì)應(yīng)的字符串轉(zhuǎn)換為ascll碼表對(duì)應(yīng)的數(shù)字桑逝,然后再把數(shù)字轉(zhuǎn)換為二進(jìn)制,取8位二進(jìn)制的前6位俏让,剩下的2個(gè)二進(jìn)制位和后面的二進(jìn)制繼續(xù)拼接楞遏,依次類(lèi)推,最后再把6個(gè)二進(jìn)制碼轉(zhuǎn)換為Base64對(duì)應(yīng)的編碼首昔,如

字符串????? a??????b??????? c

ASCII?????97????? 98?????? 99

8bit?? 01100001 01100010 01100011

6bit?? 011000?? 010110?? 001001?? 100011

十進(jìn)制????? 24????? 22??????? 9??????? 35

對(duì)應(yīng)編碼??? Y???????W??????? J??????? j

????????3個(gè)ASCII字符剛好轉(zhuǎn)換成對(duì)應(yīng)的4個(gè)Base64字符寡喝。但是,當(dāng)需要轉(zhuǎn)換的字符數(shù)不是3的倍數(shù)的情況下該怎么辦呢勒奇?Base64規(guī)定预鬓,當(dāng)需要轉(zhuǎn)換的字符不是3的倍數(shù)時(shí),一律采用補(bǔ)0的方式湊足3的倍數(shù)赊颠,如:



????????對(duì)于文本A格二,每6個(gè)Bit為一組劈彪,第一組轉(zhuǎn)換后為字符“Q”,第二組末尾補(bǔ)4個(gè)0轉(zhuǎn)換后為字符“Q”蟋定。剩下的使用“=”替代粉臊。即字符“A”通過(guò)Base64編碼后為“QQ==”。這就是Base64的編碼過(guò)程驶兜。

在python2中運(yùn)行如下命令查看

>>> import base64

>>> a=base64.b64encode('A')?

>>> a

'QQ=='

>>>?

?????? b64encode函數(shù)的參數(shù)為byte類(lèi)型扼仲,如果字符為unicode編碼,需要先進(jìn)行轉(zhuǎn)碼抄淑,如

>>> a=base64.b64encode(u'中文'.encode('utf-8'))

>>> a

'5Lit5paH'

>>>?

?????? 解碼命令為

>>> base64.b64decode(a)

'\xe4\xb8\xad\xe6\x96\x87'???????? ??????????#“中文”的utf-8編碼格式

>>>?

>>> print base64.b64decode(a)

中文

Base64編碼的應(yīng)用

?????? Base64編碼的應(yīng)用場(chǎng)景有

1屠凶、實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)加密,使用戶(hù)一眼望去完全看不出真實(shí)數(shù)據(jù)內(nèi)容肆资,base64算法的復(fù)雜程度要小矗愧,效率要高相對(duì)較高。

很多下載類(lèi)網(wǎng)站都提供“下載”的鏈接郑原,其地址通常是加密的專(zhuān)用下載地址唉韭,如


其中旋風(fēng)地址就是由原始地址在其前后分別添加AA和ZZ,再經(jīng)過(guò)base64編碼后得到的犯犁。如

>>> a=base64.b64encode('www.baidu.com/img/sslm1_logo.gif')???

>>> a

'd3d3LmJhaWR1LmNvbS9pbWcvc3NsbTFfbG9nby5naWY='

>>>?

2属愤、編碼的主要的作用不在于安全性,而在于讓內(nèi)容能在各個(gè)網(wǎng)關(guān)間無(wú)錯(cuò)的傳輸酸役,這才是Base64編碼的核心作用住诸。在計(jì)算機(jī)中任何數(shù)據(jù)都是按ascii碼存儲(chǔ)的,而ascii碼的128~255之間的值是不可見(jiàn)字符涣澡。而在網(wǎng)絡(luò)上交換數(shù)據(jù)時(shí)贱呐,比如說(shuō)從A地傳到B地,往往要經(jīng)過(guò)多個(gè)路由設(shè)備入桂,由于不同的設(shè)備對(duì)字符的處理方式有一些不同奄薇,這樣那些不可見(jiàn)字符就有可能被處理錯(cuò)誤,這是不利于傳輸?shù)目钩睢K跃拖劝褦?shù)據(jù)先做一個(gè)Base64編碼惕艳,統(tǒng)統(tǒng)變成可見(jiàn)字符,這樣出錯(cuò)的可能性就大降低了驹愚。

3、應(yīng)用在url中劣纲,url中&a=b是會(huì)作為參數(shù)名(a)和參數(shù)值(b)發(fā)送的逢捺,如果你發(fā)送的參數(shù)b中有&,那就會(huì)被瀏覽器認(rèn)為是另一個(gè)參數(shù)名了癞季,而這不是你的本意劫瞳。所以倘潜,這時(shí)候你就可以把參數(shù)值b通過(guò)Base64進(jìn)行編碼,而你的服務(wù)器在獲取到b后再解碼b志于,就得到了原本帶有&的b值了涮因。



FYI,delete immediately if any infringements declared.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伺绽,隨后出現(xiàn)的幾起案子养泡,更是在濱河造成了極大的恐慌,老刑警劉巖奈应,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澜掩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡杖挣,警方通過(guò)查閱死者的電腦和手機(jī)肩榕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惩妇,“玉大人株汉,你說(shuō)我怎么就攤上這事「柩辏” “怎么了乔妈?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)挺份。 經(jīng)常有香客問(wèn)我褒翰,道長(zhǎng),這世上最難降的妖魔是什么匀泊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任优训,我火速辦了婚禮,結(jié)果婚禮上各聘,老公的妹妹穿的比我還像新娘揣非。我一直安慰自己,他們只是感情好躲因,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布早敬。 她就那樣靜靜地躺著,像睡著了一般大脉。 火紅的嫁衣襯著肌膚如雪搞监。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天镰矿,我揣著相機(jī)與錄音琐驴,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绝淡,可吹牛的內(nèi)容都是我干的宙刘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼牢酵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悬包!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起馍乙,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤布近,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后潘拨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吊输,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年铁追,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了季蚂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡琅束,死狀恐怖扭屁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涩禀,我是刑警寧澤料滥,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站艾船,受9級(jí)特大地震影響葵腹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屿岂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一践宴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爷怀,春花似錦阻肩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吁朦,卻和暖如春柒室,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逗宜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工雄右, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剥啤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓不脯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刻诊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子防楷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354