Base64是常用的字符编码,但它并不是安全领域下的加密/解密算法,它到核心作用是传输数据的正确性。
由于有些网关或系统只能使用ASCII字符,而Base64就可以将非ASCII字符转换为ASCII字符,因此特别适合HTTP,mime协议下传输数据。
JDK
在JDK 1.6之前,JDK核心类一直没有Base64的实现类,因此当时有建议使用Sun/Oracle JDK里的sun.misc.BASE64Encoder和sun.misc.BASE64Decoder,这样可以不依赖第三方类库,但是在未来版本可能会删除,而且性能不佳。
此外,JDK 1.在javax.xml.bind.DatatypeConverter有两个静态方法parseBase64Binary和printBase64Binary。
JDK 8
在Java 8的java.util包实现BASE64编码/解码功能。
java.util.Base64提供3种BASE64编码/解码器:
Basic编码:标准的BASE64编码,处理常规需求
URL编码:使用下划线替换URL里面的反斜线“/”
MIME编码:使用基本字母数字产生BASE64输出,每一行不超出76个字符,且每行以\r\n结束
BASIC编码
// 编码
String asB64 = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));
System.out.println(asB64); // 输出为: c29tZSBzdHJpbmc=
// 解码
byte[] asBytes = Base64.getDecoder().decode("c29tZSBzdHJpbmc=");
System.out.println(new
String(asBytes, "utf-8")); // 输出为: some string
URL编码
String urlEncoded = Base64.getUrlEncoder().encodeToString("subjects?abcd".getBytes("utf-8"));
System.out.println("Using URL Alphabet: " + urlEncoded);
// 输出为:
Using URL Alphabet: c3ViamVjdHM_YWJjZA==
MIME编码
StringBuilder sb = new
StringBuilder();
for(int t = 0; t < 10; ++t) {
sb.append(UUID.randomUUID().toString());
}
byte[] toEncode = sb.toString().getBytes("utf-8");
String mimeEncoded = Base64.getMimeEncoder().encodeToString(toEncode);
System.out.println(mimeEncoded);
第三方实现
Apache Commons Codec library提供org.apache.commons.binary.Base64
Google Guava提供com.google.common.io.BaseEncoding.base64()
net.iharder.Base64提供
号称Base64编码速度最快的MigBase64
性能测试
定义两个接口
private static interface Base64Codec
{
public String encode(final byte[] data);
public byte[] decode(final String base64) throws IOException;
}
private static interface Base64ByteCodec
{
public byte[] encodeBytes(final byte[] data);
public byte[] decodeBytes(final byte[] base64) throws IOException;
}
【参考】