一、首先来说一下Base64
Base64是一种基于64个可打印字符来表示 二进制数据 的表示方法。由于,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同,普通的(RFC4648中规定)最后两个字符是:'+','/'。Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据
二、如果二进制数据不能被3字节整除怎么办?
从上面我们了解到:3个字节可由4个可打印字符来表示,那么如果原始的数据的字节长度不是3的整数倍该如何处理呢?
如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行Base64的编码。在编码后的Base64文本后加上一个或两个=号,代表补足的字节数。也就是说,当最后剩余两个八位字节(2个byte)时,最后一个6位的Base64字节块有四位是0值,最后附加上两个等号;如果最后剩余一个八位字节(1个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。 参考下表:
Base64索引表:
三、样例:
public class Test {
public static void main(String[] args) {
byte[] src = {0};
String encoder = Base64.getEncoder().encodeToString(src);
System.out.println(encoder);
}
}
输出结果:AA==
四、MIME格式的Base64:
在MIME格式的电子邮件中,Base64可以用来将二进制的字节序列数据编码成ASCII字符序列构成的文本。使用时,在传输编码方式中指定Base64。使用的字符包括大小写拉丁字母各26个、数字10个、加号+和斜杠/,共64个字符,等号=用来作为后缀用途。
完整的Base64定义可见RFC 1421和RFC 2045。编码后的数据比原始数据略长,为原来的。在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行:{'\r','\n'}。可以估算编码后数据长度大约为原长的135.1%。
五、URL格式的Base64:
Base64编码可用于在HTTP环境下传递较长的标识信息,用作HTTP表单和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。此时,采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的/和+字符变为形如%XX的形式,而这些%号在存入数据库时还需要再进行转换,因为ANSI SQL中已将%号用作通配符。为解决此问题,可采用一种用于URL的改进Base64编码,并将标准Base64中的+和/分别改成了-和_,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。