Published on

编码与解码

Authors

计算机的编码

我们知道,在计算机的内部,所有的数据和指令,都是以二进制的形式存储的,只有01两种状态。

但是01并不符合人类的阅读习惯,所以我们要有一个转换。有多种不同的转换方式,对应多种编码标准。例如,在ASCII编码中,一共有128个编码,例如大写的字母A对应的二进制编码是01000001,十进制表示为65

不同的编码方式对同一段二进制编码的理解方式是不同的,除了ASCII编码外还有UTF-8,UTF-16,GBK等,这里不再一一赘述。

base64编码

base64编码是将二进制表示成文本的一种方式,把3字节的二进制数据,6个bit一组,用一个整数表示,对应的整数范围是[0, 63],然后把这些整数用A~Za~z0~9+/=这些字符表示,0~25对应A~Z26~51对应a~z52~61对应0~9+/对应6263

从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编码效率更高,不过不太常用。