早期電子郵件系統 (RFC 822) 僅支持 ASCII 可打印字符傳輸。為了在基於文本的協議 (SMTP、HTTP、XML、JSON) 中傳輸二進制數據 (圖片、加密密文、壓縮包),必須將任意字節流編碼為安全的文本字符。Base64 由此誕生,成為「二進制到文本」的通用編碼標準。
字符集 (64 字符 + 1 填充字符):
索引 0-25 : 'A'-'Z'
索引 26-51 : 'a'-'z'
索引 52-61 : '0'-'9'
索引 62 : '+'
索引 63 : '/'
填充字符 : '='
輸入: "Ma" (2 字節: 0x4D 0x61)
二進制: 01001101 01100001
分組(6bits): 010011 010110 000100 (第三組補2個0)
索引: 19 22 4
輸出: T W E + 填充 '='
結果: "TWE="
標準 Base64 中的 +、/、= 在 URL 中有特殊含義 (空格、路徑分隔、查詢參數分隔),直接傳輸會導致歧義或被轉義增加長度。
變體規則:
| 標準 Base64 | URL 安全 Base64URL | 說明 |
|---|---|---|
| + | - (減號) | 避免被解析為空格 |
| / | _ (下劃線) | 避免被解析為路徑分隔 |
| = (填充) | 可選:省略 或 . (點號) | 省略需解碼端根據長度推算;點號用於某些特定協議 |
import java.util.Base64;
public class Base64UrlDemo {
public static void main(String[] args) {
byte[] data = "Hello, World!".getBytes(StandardCharsets.UTF_8);
// 標準 Base64
String standard = Base64.getEncoder().encodeToString(data);
System.out.println("標準: " + standard); // SGVsbG8sIFdvcmxkIQ==
// URL 安全 Base64 (無填充)
String urlSafe = Base64.getUrlEncoder().withoutPadding().encodeToString(data);
System.out.println("URL安全: " + urlSafe); // SGVsbG8sIFdvcmxkIQ
// 解碼 (自動兼容標準/URL安全)
byte[] decoded = Base64.getDecoder().decode(urlSafe);
System.out.println("解碼: " + new String(decoded, StandardCharsets.UTF_8));
}
}
Base64.getMimeEncoder()。byte[] 或 ByteBuffer,使用 Base64.Encoder.wrap(OutputStream) 流式處理。Base64.getEncoder() 返回實例可復用,線程安全。Base64 是二進制數據在文本協議中生存的「通用適配器」。理解其 3→4 分組映射邏輯、填充機制、URL 安全變體替換規則,並熟練使用 JDK 內置 java.util.Base64 (JDK 8+) 或 Apache Commons Codec / Guava 等成熟庫,能有效解決圖片內嵌、Token 傳遞、簽名編碼、配置序列化等眾多工程場景。記住:它是編碼,不是加密;體積會膨脹 33%;URL 傳輸必須用 URL 安全變體。