Base64?
Base64是一种用64个字符来表示任意二进制数据的方式。
对于二进制文件如图片、exe、音频、视频等,包含很多无法显示和打印的字符,如果希望能够通过记事本这样的文本处理软件处理二进制数据,就需要一个二进制转字符串的转换方法。
Base64是一种非常常用的二进制编解码方案。编解码方法简单且公开,并不具有加密解密的效用。只作为一种二进制数据的文本存储格式。
Base64的64个字符
64个字符,每个字符代表一种编码,共64种编码。
A-Z , a-z , 0-9 , + , /
Base64的编码原理
对于长短不一的二进制数据,Base64将其从头部开始以三个字节为一组(24 bit),一组划分成4等块(每块6 bit),根据乘法原理,这6bit的二进制共有2^6 = 64种编码方式,正好对应64个字符。
换句话说,Base64将二进制数据从头开始,每6 bit 用一个字符(64个基本字符中的一个)代替表示,一直到二进制数据末尾。
不论是Unicode字符集(Java默认,一个英文字符2个字节),还是UTF-8(一个英文字符1个字节),亦或是ASCII(一个英文字符一个字节),二进制数据通过Base64进一步转化后长度一定是增加的。虽然增加了网络传输量,但是好处是不会存在因为无法显示或打印的字符而造成数据的丢失,保证了数据在传输中的完整性。
Base64的补位
Base64要求转化后的结果必须能被 4 整除,也就是说二进制数据字节数必须是3的倍数,如果末尾多出一个或两个字节,Base64会额外补充一个“=” 或两个“=”,表示补了多少个字节,在解码的时候会自动去掉。
Java8的Base64
在Java8之前一直是缺少Base64编码解码的API,我们通常会使用第三方工具。
Java8 为开发者提供了 java.util.Base64 的工具类,并提供一套静态方法获取三种Base64编解码器:
1)Basic编码
2)URL编码
3)MIME编码
Basic编码
Basic编码是标准的Base64编码,用于处理常规的需求:输出的内容不添加换行符,而且输出的内容由64个基本字符组成。
try {String encoded = Base64.getEncoder().encodeToString("Will Smith = 威尔·史密斯".getBytes("UTF-8"));System.out.println(encoded);String decoded = new String(Base64.getDecoder().decode(encoded));System.out.println(decoded);
} catch (UnsupportedEncodingException e) {e.printStackTrace();
}
输出:
URL编码
由于标准的Basic编码可能会出现+ 和 / ,在URL中就不能直接作为参数,所以又有一种“url safe” 的Base64编码,其实就是吧字符 + 和 / 分别变成 - 和_
MIME编码
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用对应的应用程序来打开的方式类型。
它是一种互联网标准,扩展了电子邮件标准,使其可以支持:非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分组成的消息体;包含非ASCII字符的头信息等。
举个栗子:右键中有一个Word附件(二进制文件),点击预览,浏览器会直接打开Office。可以理解为MIME设定了这种对应关系。
MIME编码器会使用基本的字母数字产生BASE64输出,而且对MIME格式友好:每一行输出不超过76个字符,而且每行以“\r\n”符结束。