序言
在說Base64之前,我們應當知道位與字節的含義:
- 位(bit): 計算機中數據的最小單位, 也就是平常看到的‘0’ 和 ‘1’這樣的東西, 每個‘0’或‘1’代表一位。
- 字節(Byte): 計算機中數據的基本單位,每8位組成一個字節。 即 1B =8b
爲什麼要Base64編碼
因爲在網絡傳輸數據時,有些數據並不是都是可見字符,那些不可見字符(如 空格、換行等等)可能會被處理錯誤。 像傳輸圖片, 圖片我們用文本編輯器打開的話是亂碼的,因爲包含了不可見的字符。 直接傳輸的話,那些不可見的字符傳輸就有問題,所以Base64編碼解決的就是 把不可見的字符全部編碼爲可見的字符,這樣傳輸被處理錯誤的可能性大大降低。
Base64編碼原理
Base64是一種基於64個可打印的字符來表示二進制數據的方法。 可打印的64個字符包含A-Z、a-z、0-9、+、/
如下圖:
Base64編碼原理幾個基本步驟
- 每3個字節的ascii碼爲一組,就有24bit
- 然後分爲4組,每組6bit。
- 算出每組二進制轉爲十進制值
- 然後根據Base64 索引表 (十進制值就代表索引) 來找對應的字符。 得到的就是Base64編碼後的字符。
例如 abc
- ascii編碼 : 97 、 98 、99
- 二進制 : 01100001 、 01100010 、01100011
- 每6bit分爲一組: 011000 、010110 、 001001 、100011
- 索引值: 24 、 22 、 9 、 35
- 根據Base64索引表找到對應的值: Y 、 W 、 J 、j
測試驗證:
"abc"經過Base64編碼後得到的結果爲YWJj , 說明按照這樣的計算時沒有問題的。
如果待Base64編碼的字節數不是3的倍數怎麼辦。
一個字節時: Base64是每三個字節一組,但是隻有一個字節,只有8位,每6位分爲一組,多出的2位 不足6位, 就後面補0 湊齊6位, 但是後面還有兩個輸入數據,不夠就用 ‘=’代替。 如上圖
測試驗證:
兩個字節時: Base64是每三個字節一組,但是隻有兩個字節,只有16位,每6位一組,多出4位,不足
6位,後面補兩個0湊齊6位, 但是最後還有一位需要輸入,就用‘=’代替。如上圖
測試驗證:
Base64是以三個字節爲一組,所以只有兩種情況:要麼多一個字節,要麼多兩個字節。 多一個字節時後面會多兩個‘==’,多兩個字節時會多一個‘=’。
Base64解碼就是編碼逆過程,懂編碼原理,解碼原理逆推即可。
總結:
- Base64編碼作用就是把有不可見的字符全部轉爲可見的字符。以方便網絡傳輸;
- Base64不屬於加密,雖然Base64編碼後,肉眼很難看出來,但是Base64編碼原理很簡單,很容易被解析出來。
- 字符在不同的編碼下,如UTF-8、GBK等。可能通過Base64編碼後得到的結果不同。
- Base64是以三個字節爲一組,3*8=24位,然後以6位一組,4組那就是4個字節,所以每三個字節Base64後就會多出一個字節。