Java 中的 Base64 编码和解码

原文:https://www.studytonight.com/java-examples/base64-encoding-and-decoding-in-java

Base64 类是java.util 类的一部分,为 Base64 编码和解码方案提供静态方法。 Java 8 引入了 Base64 类。这个类支持三种类型的 Base64 编码——基本、网址和文件名安全以及 MIME。

在本教程中,我们将使用java.util.Base64类和 Apache Commons 库学习 Base64 编码和解码。

Base64 基本编码和解码

基本编码器使用 Base64 字母表进行编码和解码。它不会向编码字符串添加任何行分隔符。我们将使用getEncoder()方法返回一个简单的 Base64。编码器

如上所述,该编码器使用基本类型 base64 编码方案。接下来,我们将使用encodeToString()方法。它接受一个字节数组作为输入,并返回一个编码字符串。

import java.util.Base64;
public class Demo
{
    public static void main(String args[])
    {
        String strToEncode = "Hello World";
        byte[] bytesToEncode = strToEncode.getBytes();
        String encodedStr = Base64.getEncoder().encodeToString(bytesToEncode);        
        System.out.print(encodedStr);
    }
}

SGVsbG8gV29ybGQ=

为了解码一个编码的字符串,我们将使用 Base64。解码器通过getDecoder()方法返回。然后,我们将使用解码器的decode() 方法。它将接受一个编码的字符串作为输入,并返回解码的字符串。

import java.util.Base64;
public class Demo
{
    public static void main(String args[])
    {
        String strToEncode = "Hello World";
         //encoding
        byte[] bytesToEncode = strToEncode.getBytes();
        String encodedStr = Base64.getEncoder().encodeToString(bytesToEncode);
        System.out.println("Encoded String: " + encodedStr);
        //decoding
        byte[] decodedByteArr = Base64.getDecoder().decode(encodedStr);
        String decodedStr = new String(decodedByteArr);
        System.out.println("Decoded String: " + decodedStr);
    }
}

编码字符串:SGVsbG8gV29ybGQ= 解码字符串:Hello World

无填充的 Base64 编码

如果编码字符串的长度不是三的倍数,上一节中执行的编码会添加额外的填充字符( = )。下面的代码演示了这一点。我们可以在编码字符串的末尾看到两个等号(=)。

import java.util.Base64;
public class Demo
{
    public static void main(String args[])
    {
        String strToEncode = "Java";
        byte[] bytesToEncode = strToEncode.getBytes();
        String encodedStr = Base64.getEncoder().encodeToString(bytesToEncode);//Encoding with padding
        System.out.println("Encoded String: " + encodedStr);
    }
}

编码字符串:SmF2YQ==

如果我们不想要这个填充,我们可以在编码器上使用withoutPadding()方法。

import java.util.Base64;
public class Demo
{
    public static void main(String args[])
    {
        String strToEncode = "Java";
        byte[] bytesToEncode = strToEncode.getBytes();
        String encodedStr = Base64.getEncoder().withoutPadding().encodeToString(bytesToEncode);//encoding without padding
        System.out.println("Encoded String: " + encodedStr);
    }
}

编码字符串:SmF2YQ

Base64 网址编码和解码

Base64 类通过使用网址和文件名安全的 Base64 字母表来处理网址编码和解码。我们可以使用getUrlEncoder()方法获得一个 Base64 URL 编码器。然后,我们可以像上一节一样使用encodeToString()方法。

同样,我们有一个getUrlDecoder()方法,返回一个 URL 解码器。同样,我们可以使用这个解码器的decode() 方法。

import java.util.Base64;
public class Demo
{
    public static void main(String args[])
    {
        String urlToEncode = "https://go.java/?intcmp=gojava-banner-java-com";
         //Encoding
        String encodedUrl = Base64.getUrlEncoder().encodeToString(urlToEncode.getBytes());
        System.out.println("Encoded URL: " + encodedUrl);
        //Decoding
        byte[] decodedUrlBytes = Base64.getUrlDecoder().decode(encodedUrl);
        String decodedUrl = new String(decodedUrlBytes);
        System.out.print("Decoded URL: " + decodedUrl);
    }
}

编码的 URL:ahr 0 CHM 6 ly 9 nby 5 qyzhlz 9 pbnrjbxa 9 z29 qyzhlwbm 5 LCI 1 qyxzhnvbq = = 编码的 URL: https://go.java/?intcmp=gojava 横幅 java-com

Base64 MIME 编码和解码

MIME 代表多用途互联网邮件扩展,Base64 类使用 Base64 字母表进行编码和解码操作。在编码输出中,每行最多包含 76 个字符。

每一行以回车符( \r )结束,后跟换行符( \n )作为行分隔符。请注意,编码字符串的末尾没有行分隔符。

我们可以使用getMimeEncoder()encodeToString()方法进行编码。

import java.util.Base64;
import java.util.UUID;
public class Demo
{
    public static void main(String args[])
    {
        //Creating a MIME input for encoding
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10; ++i) {
            sb.append(UUID.randomUUID().toString());
         }
        //Encoding
         byte[] bytes = sb.toString().getBytes();
         String mimeEncodedStr = Base64.getMimeEncoder().encodeToString(bytes);
         System.out.println("Encoded String: " + mimeEncodedStr);
    }
}

编码字串:ntdjmzlmgmtowfmys 00 yj5lwxntnzntzlzwmzlnwvztyhhngemzmms 00 nwxlwfj mmunitywi 4 zjldjlmzljngizmgexotktodc 0 ny 00 zjwlwmqtmdgxmgq 4y J1 mgnjntaxzdj njctowmwos 00 m2 lw2

要解码,我们将使用getMimeDecoder()获得一个解码器,然后我们将使用decode()方法。

import java.util.Base64;
import java.util.UUID;
public class Demo
{
    public static void main(String args[])
    {
        //Creating a MIME input for encoding
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10; ++i) {
            sb.append(UUID.randomUUID().toString());
         }        
        //Encoding
         byte[] bytes = sb.toString().getBytes();
         String mimeEncodedStr = Base64.getMimeEncoder().encodeToString(bytes);         
         //Decoding
         byte[] mimeDecodedBytes = Base64.getMimeDecoder().decode(mimeEncodedStr);
         String mimeDecodedStr = new String(mimeDecodedBytes);
    }
}

使用阿帕奇公共图书馆

Apache Commons 库还在其org.apache.commons.codec.binary包中提供了一个 Base64 类。这个类包含五个不同的构造器,用于不同的编码方案。创建 Base64 实例后,我们可以对字符串字节使用encode()decode()方法来执行编码和解码。

import org.apache.commons.codec.binary.Base64;
public class Demo
{
    public static void main(String args[])
    {
        Base64 base64 = new Base64();
        //encoding
        String strToEncode = "Hello World";
        byte[] encodedBytes = base64.encode(strToEncode.getBytes());
        String encodedStr = new String(encodedBytes);
        System.out.println("Encoded String: " + encodedStr);
        //decoding
        byte[] decodedByteArr = base64.decode(encodedStr.getBytes());
        String decodedStr = new String(decodedByteArr);
        System.out.println("Decoded String: " + decodedStr);
    }
}

编码字符串:SGVsbG8gV29ybGQ= 解码字符串:Hello World

我们也可以使用静态方法encodeBase64()decodeBase64().`` 直接访问 API

import org.apache.commons.codec.binary.Base64;
public class Demo
{
    public static void main(String args[])
    {
        String strToEncode = "Hello World";
        //encoding
        String encodedStr = new String(Base64.encodeBase64(strToEncode.getBytes()));
        System.out.println("Encoded String: " + encodedStr);
        //decoding
        String decodedStr = new String(Base64.decodeBase64(encodedStr.getBytes()));
        System.out.print("Decoded String: " + decodedStr);
    }
}

编码字符串:SGVsbG8gV29ybGQ= 解码字符串:Hello World

摘要

在 Java 8 中添加了java.util 包的 Base64,以提供 Base64 编码和解码功能。它支持三种不同的 Base64 编码和解码方案——基本、网址和文件名安全以及 MIME。这个类提供像getEncoder()getDecoder()这样的静态方法来获取 base64 编码器和解码器。

然后,我们可以使用encodeToString()decode()方法来执行编码和解码操作。我们还可以使用 Apache Commons 库的 Base64 类来执行 Base64 编码和解码。