位:"位(bit)"是計算機中最小的數據單位。每一位的狀態只能是0或1;網絡
字節:8個二進制位構成1個"字節(Byte)",字節是存儲空間的基本計量單位。1個字節能夠儲存1個英文字母,2個字節能夠存儲1個漢字;post
Base64編碼的做用編碼
由於有些網絡傳送渠道並不支持全部的字節,例如傳統的郵件只支持可見字符的傳送,像ASCII碼的控制字符就不能經過郵件傳送。這樣就受到了很大的限制,好比圖片二進制流的每一個字節不可能所有是可見字符,因此就傳送不了。最好的方法就是在不改變傳統協議的狀況下,開闢一種新的方案來支持二進制文件的傳送。把不可見字符用可見字符來表示。而Base64就是一種基於64個可見字符來表示二進制數據的表示方法。加密
擴展:不可見字符其實並非不顯示,只是這些字符在屏幕上顯示不出來,好比:換行符、回車、退格......字符。spa
Base64編碼的原理blog
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個位組成一個單元。圖片
擴展:一、爲何取值範圍是0~63?字符串
能夠回顧一下二進制轉換10進制的方法:it
最小的二進制: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的倍數。
二、爲何要保證最後編碼出來的字節數是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:010100十一、76:01001100、70:01000110
爲了解釋更加清晰,如下圖示例:
經過Base64在線編碼驗證,得出結果是正確的。
例2:
字符:M
對應ASCII碼:M:77
轉換成對應的二進制:
77:01001101
轉換結果:
經過Base64在線編碼驗證,得出結果是正確的。
總結:Base64編碼並非真正的加密方式,它只是從二進制到字符的轉換過程,說Base64編碼是加密方法,只是由於通過Base64編碼以後,讓人一眼看上去不知道什麼內容而已。