BaseEncoding
这是一个实现字符串到可打印ASCII码转换的类,支持的转换标准是参考RFC 4648
一个示例:
String encode = BaseEncoding.base32().encode("111".getBytes());
String decode = new String(BaseEncoding.base32().decode(encode));
这个类的出现,就是简化了对字符串进行BaseXX的操作。
Base64介绍
为什么要使用Base64?
计算机中任何数据都是按ASCII码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的,比如很多控制字符,就会导致处理的异常。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。
具体的场景有:
- 证书
- 邮件附件
- 某些传输协议,如SMTP协议
- HTML内嵌的Base64图片
Base64是如何实现的?
Base64其实就是用了64个字符来表示二进制数据,即a-z A-Z 0-9 +/。
对于表示字符的不同,Base64就会有很多变种,比如Base64URL,就是修改了+/,变成`-`。
Base64的计算会经过一系列的操作:
- 将字符转成ASCII码十进制
- 将ASCII转成二进制
- 按6位拆分二进制,不足的部分使用0值填充
- 将6位的二进制转成索引(十进制值)
- 根据Base64索引表转成对应的Base64编码
不需要填充的实例
需要填充的实例
Base64编码是每3个原始字符编码成4个字符,所以必须填充到3个字符的倍数。
标准Base64编码通常用 = 字符来替换最后的 A,即编码结果为 SGVsbG8hIQ==。因为 = 字符并不在Base64编码索引表中,其意义在于结束符号,在Base64解码时遇到 = 时即可知道一个Base64编码字符串结束。
补充:Base64索引表
BaseXXX...
Base32、Base16...就是表示字符的个数不一样。
如3个字符,那就是38 = 24byte Base64会让字符串增长1/3,即46,从3个字符变成4个 Base16会让字符串增长1倍,即64,从3个字符变成6个 Base32会让字符串增长1倍,即85,从3个字符变成8个(???)