Base64 编码的原理和注意点理解,一文详解释。
Base64 编码的原理和细节理解
1. Base64 的核心目的
目的:把任意二进制数据(比如图片、音频、文件、中文字符)转换成只包含文本字符的字符串。
为什么要这样做:很多系统(如电子邮件、URL)只能处理文本,如果直接传二进制可能出错或者被误解析。Base64 把二进制“伪装成文本”,安全传输。
2. Base64 编码的字符表
Base64 有 64 个字符,编码规则如下:
| 索引 | 字符 | 
|---|---|
| 0-25 | A-Z | 
| 26-51 | a-z | 
| 52-61 | 0-9 | 
| 62 | + | 
| 63 | / | 
补充:如果末尾有填充,会用
=表示。
3. 编码原理
- 
每次取 3 个字节(二进制),一共 3 × 8 = 24 bit。
 - 
把这 24 bit 按 6 bit 一组分成 4 份。
- 为什么 6 bit?因为 2^6 = 64,正好对应 Base64 的 64 个字符。
 
 - 
把每个 6 bit 当成索引去 Base64 字符表中查找对应字符。
 - 
组合起来就是编码后的 4 个字符。
 
例子:3 个字节 e4 b8 ad(中文“中”的 UTF-8)
二进制表示:
e4 = 11100100
b8 = 10111000
ad = 10101101
连起来就是 24 bit:
11100100 10111000 10101101
按 6 bit 分组:
111001 001011 100010 101101
对应十进制:
57 11 34 45
查 Base64 表:
57 → 5
11 → L
34 → i
45 → t
所以编码结果就是 "5Lit"。
4. 不够 3 字节怎么办?
- 
如果末尾不够 3 个字节(比如只有 1 或 2 个字节),Base64 会补 0:
- 补 1 个字节 → 末尾加 
= - 补 2 个字节 → 末尾加 
== 
 - 补 1 个字节 → 末尾加 
 - 
编码长度总是 4 的倍数。
 - 
注意:补 0 只是为了编码长度对齐,解码时会自动去掉。
 
5. Java 中使用 Base64
import java.util.*;
public class Main {
    public static void main(String[] args) {
        byte[] input = new byte[] { (byte) 0xe4, (byte) 0xb8, (byte) 0xad };
        // 编码
        String b64encoded = Base64.getEncoder().encodeToString(input);
        System.out.println(b64encoded); // 输出 5Lit
        // 解码
        byte[] output = Base64.getDecoder().decode(b64encoded);
        System.out.println(Arrays.toString(output)); // 输出 [-28, -72, -83]
    }
}
Base64.getEncoder()→ 编码Base64.getDecoder()→ 解码
注意:Java 的
byte是有符号的,取值范围 -128~127,超过 127 的二进制会显示为负数。
6. URL 安全的 Base64
- 标准 Base64 会用 
+、/,URL 中容易出问题。 - URL-safe Base64 会把 
+→-,/→_,避免冲突。 
byte[] input = new byte[] {0x01, 0x02, 0x7f, 0x00};
String b64url = Base64.getUrlEncoder().encodeToString(input);
System.out.println(b64url); // 输出 URL-safe 字符串
byte[] decoded = Base64.getUrlDecoder().decode(b64url);
7. Base64 的优缺点
优点:
- 可把二进制安全传输成文本。
 - 使用简单,广泛支持。
 
缺点:
- 数据膨胀:比原始数据大约 1/3。
 - Base64 只是编码,不是加密,不能保证安全。
 
二进制不也是文本吗?因为很多传输协议(如电子邮件、URL)只能安全处理 ASCII 文本,直接传二进制可能被误解析或截断。
8. 扩展
- Base64 是 64 个字符。
 - Base32、Base58 等编码减少字符数,但编码效率会降低(占用更多空间)。
 
                    
                
                
            
        
浙公网安备 33010602011771号