Base64 將任意二進制數據編碼為 64 個可打印字符(A-Z, a-z, 0-9, +, /),常用於網絡傳輸、數據存儲。
= 補齊輸出至 4 的倍數長度。
輸入: [字節1] [字節2] [字節3] (共 24 位)
aaaaaaaa bbbbbbbb cccccccc
拆分: aaaaaa aabbbbbb bbbbcccc cc cccccc
(6位) (6位) (6位) (6位)
查表: 字符1 字符2 字符3 字符4
public final class Base64Codec {
private static final char[] ENCODE_TABLE =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
private static final byte[] DECODE_TABLE = new byte[128];
static {
Arrays.fill(DECODE_TABLE, (byte) -1);
for (int i = 0; i < ENCODE_TABLE.length; i++) {
DECODE_TABLE[ENCODE_TABLE[i]] = (byte) i;
}
}
/** 編碼 byte[] -> String */
public static String encode(byte[] data) {
if (data == null) return null;
int len = data.length;
int outLen = (len + 2) / 3 * 4;
char[] out = new char[outLen];
int i = 0, op = 0;
while (i < len) {
int b1 = data[i++] & 0xFF;
int b2 = (i < len) ? data[i++] & 0xFF : 0;
int b3 = (i < len) ? data[i++] & 0xFF : 0;
int triplet = (b1 << 16) | (b2 << 8) | b3;
out[op++] = ENCODE_TABLE[(triplet >> 18) & 0x3F];
out[op++] = ENCODE_TABLE[(triplet >> 12) & 0x3F];
out[op++] = (i > len + 1) ? '=' : ENCODE_TABLE[(triplet >> 6) & 0x3F];
out[op++] = (i > len) ? '=' : ENCODE_TABLE[triplet & 0x3F];
}
return new String(out);
}
/** 解碼 String -> byte[] */
public static byte[] decode(String str) {
if (str == null) return null;
str = str.trim();
if (str.length() % 4 != 0) throw new IllegalArgumentException("Invalid Base64 length");
int pad = 0;
if (str.endsWith("==")) pad = 2;
else if (str.endsWith("=")) pad = 1;
int len = (str.length() / 4) * 3 - pad;
byte[] out = new byte[len];
int ip = 0, op = 0;
while (ip < str.length()) {
int b1 = DECODE_TABLE[str.charAt(ip++)];
int b2 = DECODE_TABLE[str.charAt(ip++)];
int b3 = DECODE_TABLE[str.charAt(ip++)];
int b4 = DECODE_TABLE[str.charAt(ip++)];
if (b1 < 0 || b2 < 0 || b3 < 0 || b4 < 0) throw new IllegalArgumentException("Invalid char");
int triplet = (b1 << 18) | (b2 << 12) | (b3 << 6) | b4;
out[op++] = (byte) (triplet >> 16);
if (op < len) out[op++] = (byte) (triplet >> 8);
if (op < len) out[op++] = (byte) triplet;
}
return out;
}
}
& 0xFF 確保無符號右移;補齊邏輯嚴格按標準。java.util.Base64(Base64.getEncoder()/getDecoder()),經過高度優化且支持 MIME/URL 安全變體。Base64 類。StandardCharsets.UTF_8。+ 換為 -,/ 換為 _,去除填充 =。