????????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.