Base64编码

203 阅读3分钟

Base64是什么

Base64编码是网络上常见的用于传输8Bit字节数据的一种编码方式,所以它是一种编码方式而不是一种加密方式。

Base64应用场景

邮件刚刚问世的时候,只能传输英文,随着用户的增加,中文/日文等文字的用户也有需求,但是这些文字不能被服务器或者网关有效的处理,因此Base64就出场了。随之Base64在URL、Cookie、网页传输少量二进制文件中也有应用。

Base64原理

Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。

通过不断的将3个字节转换为4个字节的Base64编码后会出现下面三种情况:

  1. 没有字节剩下
  2. 剩下1个字节(假如还剩下1个字节,即8位,那么需要再补4个0使其成为12位,这样就可以分为2组了)
  3. 剩下2个字节(如果剩下2个字节,即16位,那么只需要再补2个0(18位)就可以分成3组了)

Base64编码表

Base64制定了一个编码表,它由A-Z,a-z,0-9,+和/组成。 image.png

Base64编码范例

例一,Base64编码->aec

  1. 找到aec对应的ASCII编码,分别是97,101,99
  2. 它对应的二进制编码是 01100001 01100101 01100011
  3. Base64编码 011000 010110 010101 100011
  4. 补0 00011000 -> 24 00010110 -> 22 00010101 -> 21 00100011 -> 35
  5. 最终得到的新的编码就是YWVj
import java.util.Base64;

public class Main {

    public static void main(String[] args) {

        Base64.Encoder encoder = Base64.getEncoder();
        byte[] bytes = encoder.encode("aec".getBytes());
        System.out.println("aec经过Base64重新编码的得到结果是:" + new String(bytes));

    }

}

YWVj

例二,Base64编码->a

  1. 找到a对应的ASCII编码,分别是97
  2. 它对应的二进制编码是 01100001
  3. Base64编码 011000 000100
  4. 补0 00011000 -> 24 00010000 -> 16
  5. 最终得到的新的编码就是YQ,因为不足4位所以不足部分需要用=填充。最终得到的是YQ==
import java.util.Base64;

public class Main {

    public static void main(String[] args) {

        Base64.Encoder encoder = Base64.getEncoder();
        byte[] bytes = encoder.encode("a".getBytes());
        System.out.println("a经过Base64重新编码的得到结果是:" + new String(bytes));

    }

}

a经过Base64重新编码的得到结果是:YQ==

例三,Base64编码->Ma

  1. 找到Ma对应的ASCII编码,分别是77,97
  2. 它对应的二进制编码是 01001101 01100001
  3. Base64编码 010011 010110 000100
  4. 补0 00010011 -> 19 00010110 -> 22 00000100 -> 4
  5. 最终得到的新的编码就是TWE,因为不足4位所以不足部分需要用=填充。最终得到的是TWE=
public class Main {

    public static void main(String[] args) {

        Base64.Encoder encoder = Base64.getEncoder();
        byte[] bytes = encoder.encode("Ma".getBytes());
        System.out.println("Ma经过Base64重新编码的得到结果是:" + new String(bytes));

    }

}

Ma经过Base64重新编码的得到结果是:TWE=