Java实现Base64编码和解码的方式

 2022-01-07 

Base64 编码是什么?

Base64 是一种编码的方式, 并不是安全领域的加密解密算法。

Base64 的目的是把一些二进制符转成普通字符, 方便在网络上传输。

因为有些系统只能使用ASCII字符,有些二进制字符是控制字符,不能直接传送, 需要转换。
Base64 作用将 非ASCII字符转换为ASCII字符。

怎么转换的,可以参考下面这篇。
Base64 编码介绍

Java实现Base64编码和解码的方式

在Java 中, 使用Base64进行编码和解码的方式常见的有三种:

  • [推荐] 从Java 8 开始, Base64 就成为Java类库的标准,位于java.util 的包下。对应类是Base64。
  • Java 7及之前的版本,JDK默认没有支持Base64, 需要导入JRE 目录的lib 下的文件 rt.jar, 通过sun.misc.BASE64Encoder 和sun.misc.BASE64Decoder 进行加解密。(完整的路径%JAVA_HOME%\jre\lib\rt.jar)。 在JDK8中依旧可以使用这个方法。
  • Apache Commons Codec, 这是Apache 提供的常见编码器和解码器的实现,包括: Base64、Hex、Phonetic 和 URL。

Java 8 内置Base 64 编码器、解码器

Java 8 中通过java.util.Base64 提供的方法进行Base 64的编码和解码。

  • 这里以“123” 的编码为例, 编码后的字符串是 “MTIz”。
1
2
3
4
5
6
7
8
9
10
    @Test
    public void jdk8() {
        // 编码
        String encodedStr = java.util.Base64.getEncoder().encodeToString("123".getBytes());
        Assertions.assertEquals(encodedStr, "MTIz");

        // 解码
        byte[] decodeBytes = java.util.Base64.getDecoder().decode("MTIz");
        Assertions.assertEquals(new String(decodeBytes), "123");
    }

Java 7使用rt.jar 中的相关类进行编码和解码

rt.jar 中用于处理的类是 sun.misc.BASE64Encoder 和sun.misc.BASE64Decoder 。通过创建这两个类的实例后,调用encode() 和 decodeBuffer() 方法。 示例代码如下:

1
2
3
4
5
6
7
8
9
    @Test
    public void jdk7() throws IOException {
        String encodedStr =  new sun.misc.BASE64Encoder().encode("123".getBytes());
        Assertions.assertEquals(encodedStr, "MTIz");
       
        byte[] decodeBytes =  new sun.misc.BASE64Decoder().decodeBuffer("MTIz");
        Assertions.assertEquals(new String(decodeBytes), "123");

    }

Apache Commons Codec 实现Base64 的编码和解码

Apache Commons Codec 的官方地址是:
https://commons.apache.org/proper/commons-codec/。
Apache Commons Codec 用来处理Base64的类是 org.apache.commons.codec.binary.Base64。

1
2
3
4
5
6
7
8
    @Test
    public void apacheCodec() {
        String encodedStr = org.apache.commons.codec.binary.Base64.encodeBase64String("123".getBytes());
        Assertions.assertEquals(encodedStr, "MTIz");
       
        byte[] decodeBytes =   org.apache.commons.codec.binary.Base64.decodeBase64("MTIz");
        Assertions.assertEquals(new String(decodeBytes), "123");   
    }