Base64 编码与解码

Beginner

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,我们将学习如何使用 java.util.Base64 类和 Apache Commons 库在 Java 中对 Base64 数据进行编码和解码。


Skills Graph

创建一个新的 Java 文件

在这一步中,你将创建一个新的 Java 文件。打开终端并执行以下命令来创建一个新的 Java 文件:

touch ~/project/Base64Encoding.java

该命令将在 ~/project 目录下创建一个名为 Base64Encoding.java 的新文件。你可以使用任何喜欢的名称,但确保它以 .java 结尾。

基本编码与解码

在这一步中,我们将学习基本编码与解码。

  • 基本编码器使用 Base64 字母表进行编码和解码。
  • 它不会在编码后的字符串中添加任何行分隔符。
  • 我们将使用 getEncoder() 方法,该方法返回一个简单的 Base64.Encoder
  • 然后,我们将使用 encodeToString() 方法对字符串进行编码。

对于解码已编码的字符串,我们将使用 getDecoder() 方法返回的 Base64.Decoder

  • 我们将使用解码器的 decode() 方法。

使用以下代码块对字符串进行编码和解码:

import java.util.Base64;

public class Base64Encoding {
    public static void main(String[] args) {
        String strToEncode = "Hello World";
        byte[] bytesToEncode = strToEncode.getBytes(); // 将字符串转换为字节数组

        // 编码
        String encodedStr = Base64.getEncoder().encodeToString(bytesToEncode);
        System.out.println("Encoded String: " + encodedStr);

        // 解码
        byte[] decodedByteArr = Base64.getDecoder().decode(encodedStr);
        String decodedStr = new String(decodedByteArr);
        System.out.println("Decoded String: " + decodedStr);
    }
}

在终端中执行以下命令以编译并运行代码:

javac Base64Encoding.java && java Base64Encoding

无填充的 Base64 编码

在上一步中,我们看到编码会在编码后的字符串末尾添加填充字符( = )。在这一步中,我们将学习如何在不添加填充字符的情况下进行编码。

使用以下代码块对字符串进行无填充编码:

import java.util.Base64;

public class Base64Encoding {
    public static void main(String[] args) {
        String strToEncode = "Java";
        byte[] bytesToEncode = strToEncode.getBytes(); // 将字符串转换为字节数组

        // 无填充编码
        String encodedStr = Base64.getEncoder().withoutPadding().encodeToString(bytesToEncode);
        System.out.println("Encoded String: " + encodedStr);
    }
}

在终端中执行以下命令以编译并运行代码:

javac Base64Encoding.java && java Base64Encoding

URL 和文件名安全的编码与解码

在这一步中,我们将学习 URL 和文件名安全的编码与解码。

Base64 类通过使用 URL 和文件名安全的 Base64 字母表 来处理 URL 编码和解码。

  • 我们将使用 getUrlEncoder() 方法获取一个 Base64 URL 编码器。
  • 然后,我们将像上一节一样使用 encodeToString() 方法。

同样地,我们有一个 getUrlDecoder() 方法,它返回一个 URL 解码器。

  • 我们可以使用这个解码器的 decode() 方法进行解码。

使用以下代码块对 URL 进行编码和解码:

import java.util.Base64;

public class Base64Encoding {
    public static void main(String[] args) {
        String urlToEncode = "https://go.java/?intcmp=gojava-banner-java-com";

        // 编码
        String encodedUrl = Base64.getUrlEncoder().encodeToString(urlToEncode.getBytes());
        System.out.println("Encoded URL: " + encodedUrl);

        // 解码
        byte[] decodedUrlBytes = Base64.getUrlDecoder().decode(encodedUrl);
        String decodedUrl = new String(decodedUrlBytes);
        System.out.print("Decoded URL: " + decodedUrl);
    }
}

在终端中执行以下命令以编译并运行代码:

javac Base64Encoding.java && java Base64Encoding

MIME 编码与解码

在这一步中,我们将学习 MIME 编码与解码。

  • Base64 类使用 Base64 字母表进行编码和解码操作。
  • 在编码后的输出中,每行最多包含 76 个字符。
  • 每行以回车符( \r )和换行符( \n )作为行分隔符。

我们可以使用 getMimeEncoder()encodeToString() 方法进行编码。
对于解码,我们将使用 getMimeDecoder() 方法获取解码器,然后使用 decode() 方法。

使用以下代码块对 MIME 数据进行编码和解码:

import java.util.Base64;
import java.util.UUID;

public class Base64Encoding {
    public static void main(String[] args) {
        // 创建用于编码的 MIME 输入
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10; ++i) {
            sb.append(UUID.randomUUID().toString());
        }
        // 编码
        byte[] bytes = sb.toString().getBytes();
        String mimeEncodedStr = Base64.getMimeEncoder().encodeToString(bytes);
        System.out.println("Encoded String: " + mimeEncodedStr);

        // 解码
        byte[] mimeDecodedBytes = Base64.getMimeDecoder().decode(mimeEncodedStr);
        String mimeDecodedStr = new String(mimeDecodedBytes);
    }
}

在终端中执行以下命令以编译并运行代码:

javac Base64Encoding.java && java Base64Encoding

使用 Apache Commons 库

在这一步中,我们将学习如何使用 Apache Commons 库对 Base64 数据进行编码和解码。

Apache Commons 库在其 org.apache.commons.codec.binary 包中提供了一个 Base64 类。

  • 该类包含五个不同的构造函数,用于不同的编码方案。
  • 创建 Base64 实例后,我们可以使用 encode()decode() 方法对字符串字节进行编码和解码。

使用以下代码块通过 Apache Commons Base64 类对字符串进行编码和解码:

import org.apache.commons.codec.binary.Base64;

public class Base64Encoding {
    public static void main(String[] args) {

        Base64 base64 = new Base64();

        // 编码
        String strToEncode = "Hello World";
        byte[] encodedBytes = base64.encode(strToEncode.getBytes());
        String encodedStr = new String(encodedBytes);
        System.out.println("Encoded String: " + encodedStr);

        // 解码
        byte[] decodedByteArr = base64.decode(encodedStr.getBytes());
        String decodedStr = new String(decodedByteArr);
        System.out.println("Decoded String: " + decodedStr);

        // 直接使用静态方法 encodeBase64() 和 decodeBase64() 访问 API
        String strToEncode2 = "Hello World";
        String encodedStr2 = new String(Base64.encodeBase64(strToEncode.getBytes()));
        String decodedStr2 = new String(Base64.decodeBase64(encodedStr.getBytes()));
    }
}

在终端中执行以下命令以编译并运行代码:

javac -cp commons-codec-1.15.jar Base64Encoding.java && java -cp commons-codec-1.15.jar:. Base64Encoding

注意: 要运行此代码,你需要下载并将 Apache Commons Codec 库的 .jar 文件导入到类路径中。在上面的命令中,我们添加了 -cp commons-codec-1.15.jar 来指定库的类路径。

总结

在本实验中,我们学习了如何使用 java.util.Base64 类和 Apache Commons 库在 Java 中对 Base64 数据进行编码和解码。我们涵盖了三种不同的 Base64 编码和解码方案——基本(Basic)、URL 和文件名安全(URL and Filename safe)以及 MIME。