Base64編碼:
<1>·Base64編碼簡(jiǎn)介:
Base64是一種基于64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的表示方法。由于2^6 = 64,所以每6個(gè)比特為一個(gè)單元,對(duì)應(yīng)某個(gè)可打印字符。3個(gè)字節(jié)有24個(gè)比特,對(duì)應(yīng)于4個(gè)Base64單元,即3個(gè)字節(jié)可表示4個(gè)可打印字符。它可用來(lái)作為電子郵件的傳輸編碼。在Base64中的可打印字符包括字母A-Z、a-z、數(shù)字0-9,這樣共有62個(gè)字符,此外兩個(gè)可打印符號(hào)在不同的系統(tǒng)中而不同。一些如uuencode的其他編碼方法,和之后BinHex的版本使用不同的64字符集來(lái)代表6個(gè)二進(jìn)制數(shù)字,但是不被稱為Base64。
<2>·使用Base64的原因:
在計(jì)算機(jī)中任何數(shù)據(jù)都是按ascii碼存儲(chǔ)的,而ascii碼的128~255之間的值是不可見字符。而在網(wǎng)絡(luò)上交換數(shù)據(jù)時(shí),比如說(shuō)從A地傳到B地,往往要經(jīng)過(guò)多個(gè)路由設(shè)備,由于不同的設(shè)備對(duì)字符的處理方式有一些不同,這樣那些不可見字符就有可能被處理錯(cuò)誤,這是不利于傳輸?shù)摹?
所以就先把數(shù)據(jù)先做一個(gè)Base64編碼,統(tǒng)統(tǒng)變成可見字符,這樣出錯(cuò)的可能性就大降低了。其實(shí)BASE64編碼的初衷是為了滿足電子郵件中不能直接使用非ASCII碼字符的規(guī)定,但是也有其他重要意義:所有的二進(jìn)制文件,都可以因此轉(zhuǎn)化為可打印的文本編碼,使用文本軟件進(jìn)行編輯,并且對(duì)于數(shù)據(jù)流來(lái)說(shuō)是一種簡(jiǎn)單的加密。
比如說(shuō),在Internet里,E-mail的傳送是只能傳送US-ASCII格式的文字訊息(歷史原因),ASCII是7位的,而非ASCII格式的檔案,在傳送過(guò)程中若不先經(jīng)過(guò)編碼,先編成7位再傳送,則在傳送過(guò)程中會(huì)因?yàn)檫@7位元的限制而遭到拆解,拆解之后只會(huì)讓收信方看到一堆亂七八糟不知所云的東西。經(jīng)過(guò)編碼后的資料,在傳送過(guò)程中才可順利傳送,不會(huì)有“被截掉一個(gè)bit”的危險(xiǎn),但是收信方必須具有解碼程序,將這份經(jīng)過(guò)編碼的東西還原,才能解讀“天書”,看到寄信人要傳送的真實(shí)信息。再比如傳輸一個(gè)純文本協(xié)議,二進(jìn)制中可能會(huì)出現(xiàn)被當(dāng)做控制字符處理的部分。這樣引起傳輸失敗。
<3>·編碼原理:
所謂Base64,就是說(shuō)選出64個(gè)可打印字符—-小寫字母a-z、大寫字母A-Z、數(shù)字0-9、符號(hào)”+”、”/”(再加上作為補(bǔ)全字的”=”,實(shí)際上是65個(gè)字符),作為一個(gè)基本字符集。然后,其他所有符號(hào)都轉(zhuǎn)換
成這個(gè)字符集中的字符。
1.將每三個(gè)字節(jié)作為一組,一共是24個(gè)二進(jìn)制位。
2.將這24個(gè)二進(jìn)制位分為四組,每個(gè)組有6個(gè)二進(jìn)制位。
3.在每組前面加兩個(gè)00,擴(kuò)展成32個(gè)二進(jìn)制位,即四個(gè)字節(jié)。
4.如果字節(jié)數(shù)不足三,則這樣處理:
a)二個(gè)字節(jié)的情況:將這二個(gè)字節(jié)的一共16個(gè)二進(jìn)制位,按照上面的規(guī)則,轉(zhuǎn)成三組,最后一組除了前面加兩個(gè)0以外,后面也要加兩個(gè)0。這樣得到一個(gè)三位的Base64編碼,再在末尾補(bǔ)上一個(gè)”=”號(hào)。
b)一個(gè)字節(jié)的情況:將這一個(gè)字節(jié)的8個(gè)二進(jìn)制位,按照上面的規(guī)則轉(zhuǎn)成二組,最后一組 除了前面加二個(gè)0以外,后面再加4個(gè)0。這樣得到一個(gè)二位的Base64編碼,再在末尾補(bǔ)上兩個(gè)”=”號(hào)
備注:然而,標(biāo)準(zhǔn)的Base64并不適合直接放在URL里傳輸,因?yàn)閁RL編碼器會(huì)把標(biāo)準(zhǔn)Base64中的“/”和“+”字符變?yōu)樾稳纭?XX”的形式,而這些“%”號(hào)在存入數(shù)據(jù)庫(kù)時(shí)還需要再進(jìn)行轉(zhuǎn)換,因?yàn)锳NSI SQL中已將“%”號(hào)用 作通配符。為解決此問(wèn)題,可采用一種用于URL的改進(jìn)Base64編碼,它不僅在末尾去掉填充的'='號(hào),并將標(biāo)準(zhǔn) Base64中的“+”和“/”分別改成了“-”和“_”,這樣就免去了在URL編解碼和數(shù)據(jù)庫(kù)存儲(chǔ)時(shí)所要作的轉(zhuǎn)換,避免了編碼信息長(zhǎng)度在此過(guò)程中的增加,并統(tǒng)一了數(shù)據(jù)庫(kù)、表單等處對(duì)象標(biāo)識(shí)符的格式。
另有一種用于正則表達(dá)式的改進(jìn)Base64變種,它將“+”和“/”改成了“!”和“-”,因?yàn)椤?”,“*”在正則表達(dá)式中都可能具有特殊含義。此外還有一些變種,它們將“+/”改為“_-”或“._”(用作編程語(yǔ)言中的標(biāo)識(shí)符名稱)或“.-”(用于XML中的Nmtoken)甚至“_:”(用于XML中的Name)。
編碼后的數(shù)據(jù)比原始數(shù)據(jù)略長(zhǎng),為原來(lái)的4/3{\displaystyle {\frac {4}{3}}}4、34/3dsad dw。在電子郵件中,根據(jù)RFC 822規(guī)定,每76個(gè)字符,還需要加上一個(gè)回車換行。可以估算編碼后數(shù)據(jù)長(zhǎng)度大約為原長(zhǎng)的135.1%。
<4>·實(shí)例:
編碼: Man:

圖片1.png
位數(shù)不足情況

圖片2.png