0%

Base64编码

Base64 编码:原理、应用与 Java 实现

Base64 是一种基于 64 个可打印字符(A-Z、a-z、0-9、+、/)来表示二进制数据的编码方式,它的核心作用是将二进制数据转换为文本格式,以便在仅支持文本传输的场景中安全传递(如 URL、邮件、XML 等)。

Base64 编码的核心原理

编码规则

  • 字符集:使用 64 个固定字符,对应值为 0-63:
    • A-Z(26 个):对应 0-25
    • a-z(26 个):对应 26-51
    • 0-9(10 个):对应 52-61
    • +:对应 62,/:对应 63
  • 填充符:当二进制数据长度不是 3 的倍数时,用=填充(最多 2 个),确保编码后长度为 4 的倍数。

编码过程(以 3 字节数据为例)

  1. 将 3 字节二进制数据(共 24 位)拆分为 4 个 6 位分组(24 ÷ 6 = 4)。
  2. 每个 6 位分组对应 Base64 字符集中的一个字符(0-63)。
  3. 若数据长度不足 3 字节,剩余位数用 0 填充,并用=补足 4 个字符。

示例:编码字符串"AB"(2 字节)

  • 二进制:01000001 01000010(16 位)
  • 拆分为 3 个 6 位分组 + 剩余 4 位补 0:010000 010100 001000 000000
  • 对应值:16、20、8、0 → 字符:QUJDAA==(最后两位用=填充)。

Base64 的应用场景

Base64 编码并非加密算法(编码过程可逆),主要用于二进制数据的文本化转换,典型场景包括:

  • 数据传输:在仅支持文本的协议中传输二进制数据(如 HTTP 请求体、邮件附件)。
  • 数据存储:将二进制数据(如图片、文件)以字符串形式存储(如数据库字段、配置文件)。
  • URL 安全:部分场景使用-_替代+/(避免 URL 特殊字符冲突),称为 Base64URL 编码。

Java 中的 Base64 编解码实现

Java 中常用的 Base64 工具类有两种:

  1. Apache Commons Codec:第三方库(org.apache.commons.codec.binary.Base64)。
  2. Java 8 内置java.util.Base64(推荐,无需额外依赖)。

1. Apache Commons Codec 实现(示例代码)

需引入依赖:

1
2
3
4
5
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>

编码与解码代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.apache.commons.codec.binary.Base64;
import java.nio.charset.StandardCharsets;

public class Base64Demo {
public static void main(String[] args) {
String raw = "Base64编解码";
System.out.println("原文:" + raw);

// 编码:字符串 → 字节数组 → Base64字符串
byte[] rawBytes = raw.getBytes(StandardCharsets.UTF_8);
String encoded = Base64.encodeBase64String(rawBytes);
System.out.println("编码后:" + encoded); // 输出:QmFzZTY057yW6Kej56CB

// 解码:Base64字符串 → 字节数组 → 字符串
byte[] decodedBytes = Base64.decodeBase64(encoded);
String decoded = new String(decodedBytes, StandardCharsets.UTF_8);
System.out.println("解码后:" + decoded); // 输出:Base64编解码
}
}

2. Java 8 内置 Base64 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class JavaBase64Demo {
public static void main(String[] args) {
String raw = "Base64编解码";
System.out.println("原文:" + raw);

// 编码
Base64.Encoder encoder = Base64.getEncoder();
byte[] rawBytes = raw.getBytes(StandardCharsets.UTF_8);
String encoded = encoder.encodeToString(rawBytes);
System.out.println("编码后:" + encoded); // 输出:QmFzZTY057yW6Kej56CB

// 解码
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedBytes = decoder.decode(encoded);
String decoded = new String(decodedBytes, StandardCharsets.UTF_8);
System.out.println("解码后:" + decoded); // 输出:Base64编解码
}
}

Base64 的局限性

  • 数据膨胀:编码后数据长度约为原数据的 1.33 倍(3 字节→4 字节),会增加传输 / 存储成本。
  • 非加密性:Base64 是编码而非加密,任何人都可解码,不可用于保护敏感数据(需配合加密算法)。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10