Base64 是一种编码方法,用于将二进制数据转换成64个可打印的ASCII字符的序列。这种编码方式广泛应用于在文本格式中存储二进制数据,例如在 URL、文件名、或在 XML 和 JSON 文档中。Java 中的 Base64 编码和解码通常可以通过 java.util.Base64
类实现,这个类在 Java 8 及以后的版本中提供。
以下是V 哥整理的 Java 中 java.util.Base64
类的核心组件,V 哥将重点介绍这些组件的原理和用法:
-
编码器(Encoder):
getEncoder()
:返回一个Base64.Encoder
实例,用于将数据编码为 Base64 格式。
-
解码器(Decoder):
getDecoder()
:返回一个Base64.Decoder
实例,用于将 Base64 编码的数据解码回原始格式。
-
编码表(Encoding Table):
- Base64 编码器使用一个静态的编码表来将字节映射到 Base64 字符。
-
解码表(Decoding Table):
- Base64 解码器使用一个静态的解码表来将 Base64 字符映射回字节。
-
编码模式(Encoding Mode):
BASE64
:标准的 Base64 编码模式。URL_SAFE
:URL 和文件名安全的 Base64 编码模式,使用-
和_
代替标准模式中的+
和/
。
-
行长度和填充:
- Base64 编码输出通常每76个字符会有一个换行符,但这可以通过
Encoder
的配置来改变。
- Base64 编码输出通常每76个字符会有一个换行符,但这可以通过
示例代码:
java
代码解读
复制代码
import java.util.Base64; import java.nio.charset.StandardCharsets; public class Base64Example { public static void main(String[] args) { String original = "Hello, VG!"; byte[] encoded = Base64.getEncoder().encode(original.getBytes(StandardCharsets.UTF_8)); System.out.println("Encoded: " + new String(encoded, StandardCharsets.UTF_8)); byte[] decoded = Base64.getDecoder().decode(encoded); System.out.println("Decoded: " + new String(decoded, StandardCharsets.UTF_8)); } }
在上述代码中,我们使用 Base64.getEncoder().encode()
方法将字符串 "Hello, VG!" 编码为 Base64 格式,然后使用 Base64.getDecoder().decode()
方法将其解码回原始字符串。
Base64 编码和解码的实现通常依赖于这些核心组件,它们提供了灵活的方式来处理不同场景下的编码需求。
小试牛刀后,我们来一起详细看看它们的实现原理。
1. 编码器(Encoder)
在 Java 8 引入的 java.util.Base64
包中,Encoder
类是 Base64
类的一个内部类,用于实现 Base64 编码功能。以下是 Encoder
类实现的详细步骤和原理分析:
1. 初始化编码器
首先,通过 Base64.getEncoder()
获取 Encoder
对象的实例。这个实例包含了编码过程中需要的所有配置,例如是否添加填充字符等。
java
代码解读
复制代码
Base64.Encoder encoder = Base64.getEncoder();
2. 准备编码数据
将需要编码的数据放入字节数组中。这些数据将作为输入传递给编码器。
java
代码解读
复制代码
byte[] dataToEncode = "beijing Hot".getBytes(StandardCharsets.UTF_8);
3. 编码数据
使用 Encoder
实例的 encode
方法对数据进行编码。这个方法会返回一个包含 Base64 编码结果的字节数组。
整理了一份好像面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记【点击此处即可】免费获取
java
代码解读
复制代码
byte[] encodedData = encoder.encode(dataToEncode);
4. 处理编码结果
编码后的字节数组可以转换为字符串,或者直接写入到输出流中。
java
代码解读
复制代码
String encodedString = new String(encodedData, StandardCharsets.UTF_8);
编码原理
-
Base64 字符集: Base64 编码使用一个包含 64 个字符的字符集,包括大写字母 A-Z、a-z、数字 0-9、加号(+)和斜杠(/)。
-
3 字节到 4 字符的映射: 每次从输入数据中读取 3 个字节(24 位),然后将这 24 位分割成 4 个 6 位的组。每个 6 位组映射到一个 Base64 字符。
-
填充: 如果输入数据的字节数不是 3 的倍数,在编码的最后会添加一个或两个
=
字符作为填充。 -
换行符: 在编码过程中,可以根据配置在每 76 个字符后添加换行符,以确保编码后的文本符合 MIME 的要求。
-
无填充模式: 使用
encoder.withoutPadding()
可以禁用自动填充,这样编码后的输出就不会包含=
字符。
源码分析
在 Base64.Encoder
类中,编码过程主要涉及以下几个关键部分: