这篇文章将讨论使用纯 Java、Guava 和 Apache Commons 进行 Base64 编码和解码。
Base64
是一组类似的二进制到文本的编码方案,通过将其转换为 ASCII 字符串格式来表示二进制数据 radix-64
表示。每个 Base64
digit 正好代表 6 位数据,也就是说 3 个字节可以用 4 个 6 位来表示 Base64
位数。
Base64 编码方案 当需要对需要在旨在处理文本数据的媒体上存储和传输的二进制数据进行编码时,通常使用。这是为了确保数据在传输过程中保持完整而不被修改。 Base64
常用于许多应用程序中,包括通过电子邮件发送 MIME
并将复杂数据存储在 XML
.
Java 8 最终通过提供对 Base64 编码和解码功能的支持 Base64, Base64.Encoder 和 Base64.Decoder 实用程序类。这 Base64
类包含用于获取编码器实例的静态方法(Base64.Encoder
) 和解码器 (Base64.Decoder
) 用于 Base64 编码方案。
以下程序使用 Base64.Encoder.encodeToString()
将指定字节数组编码为 Base64 编码字符串的方法和 Base64.Decoder.decode()
将 Base64 编码的字符串解码回新分配的字节数组的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.util.Base64; // Java中的Base64编码和解码 class Main { public static void main(String[] args) { String string = "Techie Delight"; // 使用 `Base64` 编码器对字符串进行编码 Base64.Encoder encoder = Base64.getEncoder(); String encoded = encoder.encodeToString(string.getBytes()); System.out.println("Encoded Data: " + encoded); // 解码编码数据 Base64.Decoder decoder = Base64.getDecoder(); String decoded = new String(decoder.decode(encoded)); System.out.println("Decoded Data: " + decoded); } } |
输出:
Encoded Data: VGVjaGllIERlbGlnaHQ=
Decoded Data: Techie Delight
除了将结果字节写入字符串之外,我们还可以使用字节数组来使用 Base64.Encoder.encode()
方法,如下图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.util.Arrays; import java.util.Base64; // Java中的Base64编码和解码 class Main { public static void main(String[] args) { String string = "Techie Delight"; // 使用 `Base64` 编码器对字符串进行编码 Base64.Encoder encoder = Base64.getEncoder(); byte[] encodedBytes = encoder.encode(string.getBytes()); System.out.println("Encoded Data: " + new String(encodedBytes)); // 解码编码数据 Base64.Decoder decoder = Base64.getDecoder(); byte[] decodedBytes = decoder.decode(encodedBytes); System.out.println("Decoded Data: " + new String(decodedBytes)); } } |
输出:
Encoded Data: VGVjaGllIERlbGlnaHQ=
Decoded Data: Techie Delight
javax.xml.bind.DatatypeConverter
这 DatatypeConverter 类从 javax.xml.bind
包有两种方法—— printBase64Binary()
和 parseBase64Binary()
,可用于将字节数组转换为包含以下词法表示的字符串 xsd:base64Binary
然后将该字符串转换回字节数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import javax.xml.bind.DatatypeConverter; // Java中的Base64编码和解码 class Main { public static void main(String[] args) { String string = "Techie Delight"; // 使用 `Base64` 编码器对字符串进行编码 String encoded = DatatypeConverter.printBase64Binary(string.getBytes()); System.out.println("Encoded String: " + encoded); // 解码编码数据 String decoded = new String(DatatypeConverter.parseBase64Binary(encoded)); System.out.println("Decoded String: " + decoded); } } |
输出:
Encoded String: VGVjaGllIERlbGlnaHQ=
Decoded String: Techie Delight
也可以使用 Guava 的 BaseEncoding 使用 Base64 编码在字节序列和可打印 ASCII 字符串之间进行可逆转换的类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import com.google.common.io.BaseEncoding; // Java中的Base64编码和解码 class Main { public static void main(String[] args) { String string = "Techie Delight"; // 使用 `Base64` 编码器对字符串进行编码 String encoded = BaseEncoding.base64().encode(string.getBytes()); System.out.println("Encoded String: " + encoded); // 解码编码数据 String decoded = new String(BaseEncoding.base64().decode(encoded)); System.out.println("Decoded String: " + decoded); } } |
输出:
Encoded String: VGVjaGllIERlbGlnaHQ=
Decoded String: Techie Delight
Apache Commons 还提供了 Base64 算法的实现。以下代码创建一个 Base64 编解码器,然后用于对指定数据进行解码和编码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import org.apache.commons.codec.binary.Base64; // 使用 Apache Commons 在 Java 中进行 Base64 编码和解码 class Main { public static void main(String[] args) { String string = "Techie Delight"; Base64 base64 = new Base64(); // 使用 `Base64` 编码器对字符串进行编码 byte[] encodedBytes = base64.encode(string.getBytes()); System.out.println("Encoded Data: " + new String(encodedBytes)); // 解码编码数据 String decodedString = new String(base64.decode(encodedBytes)); System.out.println("Decoded Data: " + decodedString); } } |
输出:
Encoded Data: VGVjaGllIERlbGlnaHQ=
Decoded Data: Techie Delight
我们也可以使用 Apache Commons 提供的静态方法 Base64
班级 – encodeBase64()
和 decodeBase64()
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import org.apache.commons.codec.binary.Base64; // 使用 Apache Commons Library 在 Java 中进行 Base64 编码和解码 class Main { public static void main(String[] args) { String string = "Techie Delight"; // 使用 `Base64` 编码器对字符串进行编码 byte[] encodedBytes = Base64.encodeBase64(string.getBytes()); System.out.println("Encoded Data: " + new String(encodedBytes)); // 解码编码数据 String decodedString = new String(Base64.decodeBase64(encodedBytes)); System.out.println("Decoded Data: " + decodedString); } } |
输出:
Encoded Data: VGVjaGllIERlbGlnaHQ=
Decoded Data: Techie Delight
这就是Java中的base64编码和解码。
from:https://www.techiedelight.com/zh/base64-encoding-decoding-java/