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。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM