Base64是網路上最常見的用於傳輸8Bit位元組代碼的編碼方式之一,在瞭解Base64編碼之前,先瞭解幾個基本概念:位、位元組。 位:"位(bit)"是電腦中最小的數據單位。每一位的狀態只能是0或1; 位元組:8個二進位位構成1個"位元組(Byte)",位元組是存儲空間的基本計量單位。1個位元組可以儲存1個 ...
Base64是網路上最常見的用於傳輸8Bit位元組代碼的編碼方式之一,在瞭解Base64編碼之前,先瞭解幾個基本概念:位、位元組。
位:"位(bit)"是電腦中最小的數據單位。每一位的狀態只能是0或1;
位元組:8個二進位位構成1個"位元組(Byte)",位元組是存儲空間的基本計量單位。1個位元組可以儲存1個英文字母,2個位元組可以存儲1個漢字;
Base64編碼的作用
因為有些網路傳送渠道並不支持所有的位元組,例如傳統的郵件只支持可見字元的傳送,像ASCII碼的控制字元就不能通過郵件傳送。這樣就受到了很大的限制,比如圖片二進位流的每個位元組不可能全部是可見字元,所以就傳送不了。最好的方法就是在不改變傳統協議的情況下,開闢一種新的方案來支持二進位文件的傳送。把不可見字元用可見字元來表示。而Base64就是一種基於64個可見字元來表示二進位數據的表示方法。
擴展:不可見字元其實並不是不顯示,只是這些字元在屏幕上顯示不出來,比如:換行符、回車、退格......字元。
Base64編碼的原理
Base64可以將ASCII字元串或者是二進位編碼成只包含A—Z,a—z,0—9,+,/ 這64個字元( 26個大寫字母,26個小寫字母,10個數字,1個+,一個 / 剛好64個字元)。這64個字元用6個bit位就可以全部表示出來,一個位元組有8個bit 位,那麼還剩下兩個bit位,這兩個bit位用0來補充。其實,一個Base64字元仍然是8個bit位,但是有效部分只有右邊的6個 bit,左邊兩個永遠是0。
Base64的編碼規則是將3個8位位元組(3×8=24位)編碼成4個6位的位元組(4×6=24位),之後在每個6位位元組前面,補充兩個0,形成4個8位位元組的形式,那麼取值範圍就變成了0~63。又因為2的6次方等於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
Base64將3個位元組轉變為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-255或0-127,BASE64的編碼表就要重新規定了。
擴展:為什麼取值範圍限制在0~63而不是0~255或者0~127?
估計可見字元有限,沒有那麼多的可見字元或者是Base64編碼的規則、約定
下圖是Base64編碼對照表,數值代表字元的索引,這個是標準Base64協議規定的,不能更改。
舉例:
例1:
字元:SLF
對應ASCII碼:S:83 L:76 F:70
轉換成對應的二進位:
83:01010011、76:01001100、70:01000110
為瞭解釋更加清晰,以下圖示例:
通過Base64線上編碼驗證,得出結果是正確的。
例2:
字元:M
對應ASCII碼:M:77
轉換成對應的二進位:
77:01001101
轉換結果:
通過Base64線上編碼驗證,得出結果是正確的。
總結:Base64編碼並不是真正的加密方式,它只是從二進位到字元的轉換過程,說Base64編碼是加密方法,只是因為經過Base64編碼之後,讓人一眼看上去不知道什麼內容而已。