前言
本文将介绍使用原生Java语言以及第三方库来实现Base64编码的各种方式。
使用原生Java(Java8及以上版本)
从Java8开始,java标准库中新增了 java.util.Base64
这个Base64的工具类,使用方式如下:
byte[] encodeResultBytes = Base64.getEncoder().encode("你好,debug.cn".getBytes(StandardCharsets.UTF_8));
System.out.println(new String(encodeResultBytes, StandardCharsets.UTF_8))
你没有看错,base64编码其实和md5输出的是一样的,都是byte array。
你可以直接将这个byte array传入String构造方法中,可以输出为字符串:
5L2g5aW977yMZGVidWcuY24=
其实还可以使用下面的方式直接将其转换为字符串:
String encodeResult = Base64.getEncoder().encodeToString("你好,debug.cn".getBytes(StandardCharsets.UTF_8));
使用commons-codec库
你可以使用commons-codec这个库的Base64工具类来生成base64:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.14</version>
</dependency>
如下所示:
String s = "你好,debug.cn";
String encodeResult = Base64.encodeBase64String(s.getBytes(StandardCharsets.UTF_8));
System.out.println(encodeResult);
你可能注意到了这个工具类还有一个encodeBase64Chunked
方法,我们更换一下:
String s = "你好,debug.cn";
String encodeResult = new String(Base64.encodeBase64Chunked(s.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8);
System.out.println(encodeResult);
可以看到输出和刚刚并没有什么区别,我们修改待编码的字符串,改的长一点:
String s = "你好,debug.cn1234567890123456789012345678901234567890cn1234567890123456789012345678901234567890cn1234567890123456789012345678901234567890cn1234567890123456789012345678901234567890cn1234567890123456789012345678901234567890";
String encodeResult = new String(Base64.encodeBase64Chunked(s.getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8);
System.out.println(encodeResult);
会看到如下的输出:
5L2g5aW977yMZGVidWcuY24xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkw
Y24xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwY24xMjM0NTY3ODkwMTIz
NDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwY24xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4
OTAxMjM0NTY3ODkwY24xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkw
居然生成了多行的字符串,这是为啥呢,我们谷歌一下,得到如下的解释:
base64的规范有两种,分别是RFC 4648 和 RFC 2045,其中
RFC 2045规定:
编码后的每行长度不能超过76个字符,且行与行之间使用\r\n
来分隔(字符串末尾没有换行)
RFC 4648规定:
编码后不能添加任何换行符
也就是说有换行符是老的规范,对于Java8的Base64类来说,不支持将其编码为带换行符的字符串,但可以解码贷后换行符的字符串。
详情可以查看Javadoc中关于Base64的描述:https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html
文章评论