编码与解码
计算机的编码
我们知道,在计算机的内部,所有的数据和指令,都是以二进制的形式存储的,只有0
和1
两种状态。
但是0
和1
并不符合人类的阅读习惯,所以我们要有一个转换。有多种不同的转换方式,对应多种编码标准。例如,在ASCII编码中,一共有128
个编码,例如大写的字母A对应的二进制编码是01000001
,十进制表示为65
。
不同的编码方式对同一段二进制编码的理解方式是不同的,除了ASCII编码外还有UTF-8,UTF-16,GBK等,这里不再一一赘述。
base64编码
base64编码是将二进制表示成文本的一种方式,把3字节的二进制数据,6个bit一组,用一个整数表示,对应的整数范围是[0, 63]
,然后把这些整数用A~Z
、a~z
、0~9
、+
、/
、=
这些字符表示,0~25
对应A~Z
,26~51
对应a~z
,52~61
对应0~9
,+
和/
对应62
、63
。
从Java 8开始,Java对base64提供了原生支持。
@Test
public void testEncode1() {
String originalInput = "ABC";
final String s = Base64.getEncoder().encodeToString(originalInput.getBytes());
System.out.println(s);
}
如果字节数不是3的整数倍,就在末尾补0x00
,缺几个就补几个,这些补的0x00
在编码后用=
表示,如下代码会输出:QUI=
。
@Test
public void testEncode2() {
String b = "AB";
final String s2 = Base64.getEncoder().encodeToString(b.getBytes());
System.out.println(s2);
}
由于邮件网关开始设计的时候,只支持ASCII编码,所以如果需要传递非ASCII的内容,只能通过base64编码以后发送,收到邮件后再对邮件进行解码。所以base64的主要目的是把二进制的信息转化成文本信息进行处理,缺点是会把原来的信息膨胀三分之一。
base64是一种编码算法,并不是一种加密算法。如果把编码的字符改成16个,就成了base16编码算法,不过这样的编码效率会更低。同样的,我们还可以有base85编码算法,这种编码算法比base64编码效率更高,不过不太常用。