Base64编码原理

1.为什么需要Base64编码?

  • 因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就不能通过邮件传送。这样就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了。
  • 最好的方法就是在不改变传统协议的情况下,开辟一种新的方案来支持二进制文件的传送。把不可见字符用可见字符来表示。而Base64就是一种基于64个可见字符来表示二进制数据的表示方法。

2.Base64编码方法

  • 简单来说,就是把原来三个字节的数据编码为四个字节。
  • 如果Base64编码后产生的字节全是补0所产生的,则显示=,这也就是我们总是会看到Base64编码末尾总是会有最多两个“=”的原因。
  • 从上面可知,Base64编码后,数据的大小会增加三分之一。
  • 因为Base64编码的每个字节最高两位是0,低六位可以表示成64种可见字符,所以称为Base64编码,从0~63所代表的的可见字符如下表:

    Base64编码原理_第1张图片

3.举个栗子

  • 下面我们算一下”1”的Base64编码是多少?
  • 我们知道1的,ASCII码是48,换成二进制就是0011 0001,所以网络传输中1就是用00110001表示的
  • 要用Base64编码,因为不够三字节,所以末尾补0: 0011 0001 0000 0000 0000 0000
  • 拆分成四字节: 00001100 00010000 00000000 00000000,每个字节高位补2个0
    所以,上面Base64编码四个字节代表的数字分别是:12 16 0 0
  • 又因为最后两个字节0全是补上的,所以表示为==,所以最后得到: MQ==

4. Base64 in Java

Java8良好的支持了Base64编码的常用操作,也就是java.util.Base64类,常用的编码和解密方法如下:


String encodedStr = Base64.getEncoder().encodeToString("some string".getBytes("utf-8"));

byte[] decodedStr = Base64.getDecoder().decode("c29tZSBzdHJpbmc=");

5.总结

  • Base64编码字符串长度一定是4的整数倍

  • Base64编码末尾一定有0、1或2个“=”,最多2个

  • Base64编码字符一定是a-z,A-Z,0-9,+和/,不可能出现其他字符

你可能感兴趣的:(JAVA)