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个(???)

results matching ""

    No results matching ""