所謂 Base64,就是說選出64個字符(小寫字母a-z、大寫字母A-Z、數字0-9、符號"+"、符號”/“、再加上作為墊底的”=“,實際上是65個字符)作為一個基本字符集。然后其他所有符號都轉換成這個字符集中的字符。
# Java11 中對應的普通編碼 private static final char[] toBase64 = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' }; # Java11 中對應的URL編碼 private static final char[] toBase64URL = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_' };
具體來說,轉換方式可以分為四步:
- 將每三個字節作為一組,一共是24個二進制位(三個字節)。
- 將這24個二進制為分為四組,每組有6個二進制位。
- 在每組前面加上兩個00,擴展成32個二進制位,即四個字節。
- 計算四個字節中每個字節對應的十進制的值。
- 用十進制的值作為下標,根據上面的編碼表,得到擴展后的每個字節的對應符號,這就是Base64的編碼值。
一、編碼過程詳解
演示字符串”Who“如何轉為Base64編碼。
注:圖中省略了給 6個二進制位加上兩個0的過程。
步驟:
- ”W“、”h“、”o“的ASCII的值分別是87、104、111,對應的二進制值是01010111、01101000、01101111,將它們連成一個24位的二進制字符串010101110110100001101111。
- 將這個24位的二進制字符串分成4組,每組6個二進制位:010101、110110、100001、101111。
- 在每組前面加兩個00,擴展成32個二進制位,即四個字節:00010101、00110110、00100001、00101111,它們的十進制值分別是21、54、33、47。
- 根據上面定義的char數組(變量toBase64),得到21、54、33、47下標對應的字符分別是V、2、h、v。
即 Who 的 Base64 編碼是 V2hv。
二、字節數不足三怎么辦
1、一個字節的情況
將這一個字節的8個二進制位,按照上面的規則轉成兩組,最后一組除了前面加兩個0以外,后面再加兩個0,這樣得到一個兩位的Base64編碼,再在末尾補上兩個”=“號。
如:”W“字符串是一個字節,可以轉化為兩組:00010101、00110000,對應的Base64值分別為 V、w,再補上兩個”=“號,即”W“的Base64編碼就是 Vw==。
2、兩個字節的情況
將這兩個字節的16個二進制位,按照上面的規則轉成三組,最后一組除了前面加兩個0以外,后面也要加兩個0,這樣得到一個三位的Base64編碼,再在末尾補上一個”=“號。
如:”Wh“字符串是兩個字節,可以轉化為三組:00010101、00110110、00100000,對應的Base64值分別為 V、2、g,再補上一個”=“號,即”Wh“的Base64編碼就是 V2g=。
三、漢字如何編碼
漢字本身有很多編碼,比如:GB2312、UTF-8、GBK等,每一種編碼的Base64編碼都是不一樣的。下面以 UTF-8 編碼為例,對漢字”吳“進行Base64編碼。
”吳“的UTF-8編碼為的十六進制是 0xE590B4(對應的十進制是 15044788),轉化為二進制是 11100101、10010000、10110100。將這個24位的二進制字符串,轉換成四組一共32位的二進制值是 00111001、00011001、00000010、00110100,相應的十進制數為 57、25、2、52,它們對應的Base64值為 5、Z、C、0。
即:”吳“的Base64值就是 5ZC0。