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

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

圖片2.png