Java8————Base64

Base64?

Base64是一种用64个字符来表示任意二进制数据的方式。

对于二进制文件如图片、exe、音频、视频等,包含很多无法显示和打印的字符,如果希望能够通过记事本这样的文本处理软件处理二进制数据,就需要一个二进制转字符串的转换方法。

Base64是一种非常常用的二进制编解码方案。编解码方法简单且公开,并不具有加密解密的效用。只作为一种二进制数据的文本存储格式。

Base64的64个字符

64个字符,每个字符代表一种编码,共64种编码。

A-Z , a-z , 0-9 , + , /

Java8————Base64_第1张图片

Base64的编码原理

对于长短不一的二进制数据,Base64将其从头部开始以三个字节为一组(24 bit),一组划分成4等块(每块6 bit),根据乘法原理,这6bit的二进制共有2^6 = 64种编码方式,正好对应64个字符。

换句话说,Base64将二进制数据从头开始,每6 bit 用一个字符(64个基本字符中的一个)代替表示,一直到二进制数据末尾。

Java8————Base64_第2张图片

不论是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编码

Java8————Base64_第3张图片

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编码,其实就是吧字符 + 和 / 分别变成 - 和_

Java8————Base64_第4张图片

 MIME编码

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用对应的应用程序来打开的方式类型。

它是一种互联网标准,扩展了电子邮件标准,使其可以支持:非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分组成的消息体;包含非ASCII字符的头信息等。

举个栗子:右键中有一个Word附件(二进制文件),点击预览,浏览器会直接打开Office。可以理解为MIME设定了这种对应关系。

MIME编码器会使用基本的字母数字产生BASE64输出,而且对MIME格式友好:每一行输出不超过76个字符,而且每行以“\r\n”符结束。

 

你可能感兴趣的:(Java,8)