蜗牛大师

吴庆龙的学习笔记

导航

Base64编码及解码原理

所谓 Base64,就是说选出64个字符(小写字母a-z、大写字母A-Z、数字0-9、符号"+"、符号”/“、再加上作为垫底的”=“,实际上是65个字符)作为一个基本字符集。然后其他所有符号都转换成这个字符集中的字符。
# Java11 中对应的普通编码
private static final char[] toBase64 = {
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
    'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
};
 
# Java11 中对应的URL编码
private static final char[] toBase64URL = {
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
    'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'
};
 
具体来说,转换方式可以分为四步:
  1. 将每三个字节作为一组,一共是24个二进制位(三个字节)。
  2. 将这24个二进制为分为四组,每组有6个二进制位。
  3. 在每组前面加上两个00,扩展成32个二进制位,即四个字节。
  4. 计算四个字节中每个字节对应的十进制的值。
  5. 用十进制的值作为下标,根据上面的编码表,得到扩展后的每个字节的对应符号,这就是Base64的编码值。
 

一、编码过程详解

演示字符串”Who“如何转为Base64编码。
注:图中省略了给 6个二进制位加上两个0的过程。
步骤:
  1. ”W“、”h“、”o“的ASCII的值分别是87、104、111,对应的二进制值是01010111、01101000、01101111,将它们连成一个24位的二进制字符串010101110110100001101111。
  2. 将这个24位的二进制字符串分成4组,每组6个二进制位:010101、110110、100001、101111。
  3. 在每组前面加两个00,扩展成32个二进制位,即四个字节:00010101、00110110、00100001、00101111,它们的十进制值分别是21、54、33、47。
  4. 根据上面定义的char数组(变量toBase64),得到21、54、33、47下标对应的字符分别是V、2、h、v。
 
即 Who 的 Base64 编码是 V2hv。
 

二、字节数不足三怎么办

1、一个字节的情况

将这一个字节的8个二进制位,按照上面的规则转成两组,最后一组除了前面加两个0以外,后面再加两个0,这样得到一个两位的Base64编码,再在末尾补上两个”=“号。
如:”W“字符串是一个字节,可以转化为两组:00010101、00110000,对应的Base64值分别为 V、w,再补上两个”=“号,即”W“的Base64编码就是 Vw==。

2、两个字节的情况

将这两个字节的16个二进制位,按照上面的规则转成三组,最后一组除了前面加两个0以外,后面也要加两个0,这样得到一个三位的Base64编码,再在末尾补上一个”=“号。
如:”Wh“字符串是两个字节,可以转化为三组:00010101、00110110、00100000,对应的Base64值分别为 V、2、g,再补上一个”=“号,即”Wh“的Base64编码就是 V2g=。
 

三、汉字如何编码

汉字本身有很多编码,比如:GB2312、UTF-8、GBK等,每一种编码的Base64编码都是不一样的。下面以 UTF-8 编码为例,对汉字”吴“进行Base64编码。
 
”吴“的UTF-8编码为的十六进制是 0xE590B4(对应的十进制是 15044788),转化为二进制是 11100101、10010000、10110100。将这个24位的二进制字符串,转换成四组一共32位的二进制值是 00111001、00011001、00000010、00110100,相应的十进制数为 57、25、2、52,它们对应的Base64值为 5、Z、C、0。
 
即:”吴“的Base64值就是 5ZC0。 

posted on 2021-01-20 13:04  蜗牛大师  阅读(1133)  评论(0编辑  收藏  举报