概述
Base64是一种字符串编码格式,采用了A-Z,a-z,0-9,“+”和“/”这64个字符来编码原始字符(还有垫字符“=”)。一个字符本身是一个字节,也就是8位,而base64编码后的一个字符只能表示6位的信息。也就是原始字符串中的3字节的信息编码会变成4字节的信息。
Base64的主要作用是满足MIME的传输需求。
在Java8中Base64编码已经成为Java类库的标准,且内置了Base64编码的编码器和解码器。
问题
偶然发现使用jdk8内置的Base64解码器进行解析的时候,会抛出java.lang.IllegalArgumentException: Illegal base64 character a异常。
这非常奇怪,因为原文是使用jdk7里面的编码器进行编码的,理论上不至于发生这种不兼容的状况。
测试程序
还是来写程序测试一下问题到底在哪里。测试程序使用了一个比较长的原文,主要是这个问题在原文较长的时候才会出现,如果原文较短(字节长度不超过57),那么不会有这个问题。
- 使用jdk7进行编码
import sun.misc.BASE64Encoder;
public class TestBase64JDK7 {
private static final String TEST_STRING = "0123456789,0123456789,0123456789,0123456789,0123456789,0123456789,0123456789";
public static void main(String[] args) {
BASE64Encoder base64Encoder = new BASE64Encoder();
String base64Result = base64Encoder.encode(TEST_STRING.getBytes());
System.out.println(base64Result);
}
}
- jdk7编码结果
MDEyMzQ1Njc4Oe+8jDAxMjM0NTY3ODnvvIwwMTIzNDU2Nzg577yMMDEyMzQ1Njc4Oe+8jDAxMjM0
NTY3ODnvvIwwMTIzNDU2Nzg577yMMDEyMzQ1Njc4OQ==
- 使用jdk8对上面的编码结果进行解码
import java.util.Base64;
public class TestBase64JDK8 {
public static void main(String[] args) {
String base64Result