1. 程式人生 > 實用技巧 >Base64編碼及解碼原理

Base64編碼及解碼原理

所謂 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', '-', '_' };
具體來說,轉換方式可以分為四步:
  1. 將每三個位元組作為一組,一共是24個二進位制位(三個位元組)。
  2. 將這24個二進位制為分為四組,每組有6個二進位制位。
  3. 在每組前面加上兩個00,擴充套件成32個二進位制位,即四個位元組。
  4. 計算四個位元組中每個位元組對應的十進位制的值。
  5. 用十進位制的值作為下標,根據上面的編碼表,得到擴充套件後的每個位元組的對應符號,這就是Base64的編碼值。

一、編碼過程詳解

演示字串”Who“如何轉為Base64編碼。 注:圖中省略了給 6個二進位制位加上兩個0的過程。 步驟:
  1. ”W“、”h“、”o“的ASCII的值分別是87、104、111,對應的二進位制值是01010111、01101000、01101111,將它們連成一個24位的二進位制字串010101110110100001101111。
  2. 將這個24位的二進位制字串分成4組,每組6個二進位制位:010101、110110、100001、101111。
  3. 在每組前面加兩個00,擴充套件成32個二進位制位,即四個位元組:00010101、00110110、00100001、00101111,它們的十進位制值分別是21、54、33、47。
  4. 根據上面定義的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。