BASE64 編碼簡析

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

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