几分钟看懂Base64编码原理

Base64简介

Base64是基于64个可打印字符(小写字母a-z,大写字母A-Z,数字0-9,符号"+","/" 再加上作为垫字的"=",实际有65个字符,其他的所有字符都要转换成这个字符集中的字符),用来表示任意二进制数据的方法。

Base64使用缘故

在二进制数据的传输中,常常包含很多无法显示和打印的字符,想要他们正常显示出来,就需要一个二进制到字符串的转换方法。Base64就是一种最常见的二进制编码方法。
常见应用就是Base64用于在HTTP协议下传输数据。由于HTTP协议是超文本传输协议,所以需要将在HTTP协议下传输的二进制数据转换成字符数据,而且网络传输只能传输可打印字符,而在实际网络传输中,传输的数据并不都是可打印字符,比如中文、二进制文件,图片等。为了成功传输这些类型的数据,此时Base64就派上大用场了。

什么是可打印字符:在ASCII码中规定,十进制数字0-31属于非打印控制字符,32-127属于可打印字符(32-126在键盘上能找到对应的字符,32代表键盘中的空格,127代表键盘中的DELETE命令)

Base64编码原理

  1. 按照从左往右的规则,每三个字节作为一组,一共就是24个二进制位。
  2. 将这24个二进制位分为四组,每组6个二进制位。
  3. 之后在每组数据前面添加00,组成每个组8个二进制位,此时变成了32个二进制位,即四个字节
  4. 然后根据下表,得到扩展后的每个字节的对应符号,base64编码方法完成

具体编码演示

  1. "G"、"o"、"d" 三个字符的ASCII值分别是71、111、100,二进制值是01000111、01101111、01100100 ,然后就组成了24位的二进制值010001110110111101100100
  2. 将这24个二进制位分成四组,分别得到010001、110110、111101、100100
  3. 在每组前面添加00,得到00010001、00110110、00111101、00100100
  4. 根据上表,得到每个值对应Base64编码,分别是:R、2、9、k

所以,得到字符串"God"的Base64编码为R29k

如果一组没有三个字节,则是这样处理的

两个字节的情况:

将这两个字节一共16个二进制位,按照上面的规则分成三组,最后一组除了前面加上00之外,后面也要加上00,这样就得到一个三位的Base64编码,再在末尾补上一个"="号。

比如,"Go" 这个字符串是两个字节,可以转化成三组 00010001,00110110,00111100,对应Base64编码分别为:h、3、8,再加上一个"=" 号,因此"Go"的Base64编码就是h38=

一个字节的情况:

将这一个字节一共8个二进制位,按照上面的规则分成两组,最后一组除了前面加上00之外,后面也要加上0000,这样就得到一个两位的Base64编码,再在末尾补两个"="号。

比如,"G" 这个字符串是一个字节,可以转化成两组 00010001,00110000,对应Base64编码分别为:R、w,再加上两个"=" 号,因此"G"的Base64编码就是Rw==

Java代码实现Base64编码与解码

public static void main(String[] args) throws UnsupportedEncodingException {    
    //编码    
    String encode = Base64.getEncoder().encodeToString("God".getBytes());        
    System.out.println(encode);   
    //解码    
    System.out.println(new String(Base64.getDecoder().decode(encode)));
}
复制代码

打印结果:

R29k
God
复制代码

更多Java后端开发干货,可以关注我的微信公众号「 红橙呀 」。