BASE64 編碼簡(jiǎn)析

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
?著作權(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)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,697評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,351評(píng)論 25 708
  • 落紅不是無(wú)情物,化作春泥更護(hù)花。
    追風(fēng)箏的人5158閱讀 221評(píng)論 0 0
  • 個(gè)人淺見:漢語(yǔ)在沒有白話之前,傳遞信息是以字為分界的,比如春風(fēng)又綠江南岸,一字傳神;比如千里兮共明月,簡(jiǎn)練而又富有...
    P的搬運(yùn)工閱讀 397評(píng)論 0 4
  • 20年前的夏天,還記得我們是怎么度過(guò)的嗎? 那時(shí)候冰箱還很少,把西瓜放在剛從井里打出的涼水中,半個(gè)小時(shí)后就變得冰涼...
    茄子懸賞閱讀 490評(píng)論 0 0

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