Base64編碼原理分析


Base64是網絡上最常見的用於傳輸8Bit字節代碼的編碼方式之一,在了解Base64編碼之前,先了解幾個基本概念:位、字節。

位:"(bit)"是計算機中最小的數據單位。每一位的狀態只能是01

字節:8個二進制位構成1"字節(Byte)",字節是存儲空間的基本計量單位。1個字節可以儲存1個英文字母,2個字節可以存儲1個漢字;

Base64編碼的作用

因為有些網絡傳送渠道並不支持所有的字節,例如傳統的郵件只支持可見字符的傳送,像ASCII碼的控制字符就不能通過郵件傳送。這樣就受到了很大的限制,比如圖片二進制流的每個字節不可能全部是可見字符,所以就傳送不了。最好的方法就是在不改變傳統協議的情況下,開辟一種新的方案來支持二進制文件的傳送。把不可見字符用可見字符來表示。而Base64就是一種基於64個可見字符來表示二進制數據的表示方法。

 

擴展:不可見字符其實並不是不顯示,只是這些字符在屏幕上顯示不出來,比如:換行符、回車、退格......字符。

Base64編碼的原理

Base64可以將ASCII字符串或者是二進制編碼成只包含A—Za—z0—9+/ 64個字符( 26個大寫字母,26個小寫字母,10個數字,1+,一個 / 剛好64個字符)。這64個字符用6bit位就可以全部表示出來,一個字節有8bit 位,那么還剩下兩個bit位,這兩個bit位用0來補充。其實,一個Base64字符仍然是8bit位,但是有效部分只有右邊的6bit,左邊兩個永遠是0

Base64的編碼規則是將38位字節(3×8=24)編碼成46位的字節(4×6=24),之后在每個6位字節前面,補充兩個0,形成48位字節的形式,那么取值范圍就變成了0~63。又因為26次方等於64,所以6個位組成一個單元

 

擴展:1、為什么取值范圍是0~63

可以回顧一下二進制轉換10進制的方法:

最小的二進制:00000000轉換為10進制的結果是0

最大的二進制:00111111轉換為10進制的結果是:

0×27+0×26+1×25+1×24+1×23+1×22+1×21+1×20 = 63

 

Base643個字節轉變為4個字節,因此,編碼后的代碼量(以字節為單位)約比編碼前的代碼量多了1/3。如果代碼量正好是3的整數倍,那么恰好多了1/3。但如果不是,那么,當多出的代碼量不是3的整數倍時,代碼量除以3的余數就是2或者1。轉換的時候,結果不夠6位的用0來補上相應的位置,之后再在6位的前面補兩個0。轉換完空出的結果就用就用“=”來補位,總之要保證最后編碼出來得字節數是4的倍數 

 

2、為什么要保證最后編碼出來的字節數是4的倍數?

因為Base64編碼時,是將3個字節轉變為4個字節,最終得到的字節數必然是4的倍數

 

Base64編碼的一個主要目的,是把任何字符都用可視字符表現出來。先把字符串拆開,成為六位二進制(前兩位補零)的形式,這樣每個字符的范圍都在0-63之間了。再用BASE64的編碼表,把取值范圍在0-63的字符變成可視字符。如果不加零或只加一個零,那么取值范圍就會是0-2550-127BASE64的編碼表就要重新規定了。

 

擴展:為什么取值范圍限制在0~63而不是0~255或者0~127

估計可見字符有限,沒有那么多的可見字符或者是Base64編碼的規則、約定

 

下圖是Base64編碼對照表,數值代表字符的索引,這個是標准Base64協議規定的,不能更改。

 

舉例:

1

字符:SLF

對應ASCII碼:S:83  L:76  F:70

轉換成對應的二進制:

830101001176010011007001000110

為了解釋更加清晰,以下圖示例:

 

通過Base64在線編碼驗證,得出結果是正確的。

 

2

字符:M

對應ASCII碼:M77

轉換成對應的二進制:

7701001101

轉換結果:

 

通過Base64在線編碼驗證,得出結果是正確的。 

 

總結:Base64編碼並不是真正的加密方式,它只是從二進制到字符的轉換過程,說Base64編碼是加密方法,只是因為經過Base64編碼之后,讓人一眼看上去不知道什么內容而已。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM