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 编码和解码。