1、Base64編碼原理
下圖為Base64編碼索引表:
字符選用了"A-Z、a-z、0-9、+、/" 64個可打印字符。數值代表字符的索引,這個是標準Base64協議規定的,不能更改。
2、關于編碼和解碼
- 編碼:由二進制轉到字符成為Base64編碼,所謂Base64編碼就是將所有二進制數據轉換為Base64字符的過程。
- 解碼:由字符轉化為二進制的過程,所謂Base64解碼就是將Base64字符轉到二進制的過程。
3、關于ASCII碼表
下圖為國際上標準的ASCII碼表:
我們知道所有的可打印字符都有其對應的ASCII碼,如“M”對應的ASCII碼為01001101,字符“z”對應的ASCII碼為01111010,我們知道,Base64字符最多能表示6bit(2^6=64),而一個字符占一個字節(8bit),所以3個字符可用Base64的4個字符表示(6和8的最小公倍數為24),所以對于一個字符串來講,每次進行Base64編碼時,都是已三個字節為單位進行轉換(三個字節恰好可以用4個Base64字符表示),對于不夠三個字節的情況,即當一個字符串的長度對3取余的余數為1或者2時,可以用兩個Base64字符表示一個普通字符,或者用三個Base64字符表示兩個普通字符,普通字符通過ASCII碼轉換為二進制時,為8bit,而兩個Base64字符轉換為二進制時為12bit,如何轉換呢?根據規則,需要在普通字符的二進制表示的末尾用0補齊12bit之后,再進行Base64字符的轉換,字符串的轉換規則為:先將普通字符串參照ASCII碼表全部轉換為二進制,從左到右,每3個字節為一組進行轉換,每3個字節(3個普通字符)對應4個Base64字符,對于末尾剩余一個8bit(剩余一個字符)的情況,可以用2個Base64字符表示,需在其末尾用0填充補齊12個bit,再將這12個bit位用兩個Base64字符表示,對于末尾剩余16bit(剩余兩個普通字符)的情況,可以用3個Base64字符表示,需在其末尾用0補齊18個bit,再將這12個bit位用兩個Base64字符表示,因為Base64字符的最小單位是4個字符一組,在轉換后,如果Base64編碼字符串的長度不是4的倍數,需在在字符串后面用“=”號填充,所以Base64字符串只可能在最后出現一個或者兩個“=”號,不可能在中間出現“=”號,也不可能出現3個“=”號的情況。
4、一個例子
注:圖表中藍色背景的二進制0值是額外補充的
Hello!! Base64編碼的結果為 SGVsbG8hIQAA 。最后2個零值只是為了Base64編碼而補充的,在原始字符中并沒有對應的字符,那么Base64編碼結果中的最后兩個字符 AA 實際不帶有效信息,所以需要特殊處理,以免解碼錯誤。
標準Base64編碼通常用 = 字符來替換最后的 A,即編碼結果為 SGVsbG8hIQ==。因為 = 字符并不在Base64編碼索引表中,其意義在于結束符號,在Base64解碼時遇到 = 時即可知道一個Base64編碼字符串結束。
5、應用
Base64編碼本質上是一種將二進制數據轉成文本數據的方案。對于非二進制數據,是先將其轉換成二進制形式,然后每連續6比特(2的6次方=64)計算其十進制值,根據該值在上面的索引表中找到對應的字符,最終得到一個文本字符串。Base64編碼主要用在傳輸、存儲、表示二進制等領域,還可以用作簡單的加密,但只是一眼看上去不知道什么內容罷了,但可通過其編碼規則對其進行解碼。