1、谜底解答
说白了就是补位
Base64编码后的数据存在“=”或“==”是因为编码数据二进制转化后,按照Base64规则进行编码不够4字节而进行补得位,缺一位就补一个“=”,缺两位就补两个“==”;必须够了四个字节
2、编码原理
前面都介绍到“=”是应为Base64编码规则导致的,那这里就绕不开要介绍一下Base64的编码规则;
Base64的编码规则其实比较简单,简单来说就是总共分五步:
第一步:将原始数据三个字节一组进行分组;
eg:123ab ->123 ab
第二步:将每一组的数据ASCII码转化为二进制数据;
eg:
123 -> 49 50 51
ab -> 97 98
第三步:将二进制数据按照每6位2进制数据为一组再次进行分组,目标分成4组,每组不足6位二进制数据进行补“0”,不足4组,则进行补“=”;
eg:
49 50 51 -> 00110001 00110010 00110011 -> 001100 010011 001000 110011
97 98 -> 01100001 01100010 -> 011000 010110 001000 =
第四步:在第三步中分好组的6位2进制数前面补充两个“0”,并转化为十进制数据;
eg:
001100 010011 001000 110011 -> 00001100 00010011 00001000 00110011 -> 12 19 8 51
011000 010110 001000 = -> 00011000 00010110 00001000 = -> 24 22 8 =
第五步:查表
Base64编码提供一张编码表,第四步转化后的十进制数据就是表的索引,可根据表的索引找到对应的字符,完整的字符便是原数据Base64编码结果;
eg:
12 19 8 51 -> M T I z
24 22 8 = -> Y W I =
则123ab -> Base64编码 -> MTIzYWI=
3、编码延伸
该章节主要介绍三个问题:
3.1、Base64编码名称和编码规则有什么关系?
Base64的名称和编码规则的主要联系来源于编码原理的第三步“将二进制数据按照每6位2进制数据为一组再次进行分组”,为什么是按照6位二进制进行分组呢,是因为64=2^6;
细心的朋友从这里就可以看出,既然Base64是因为64=2^6,那是不是同样也存在Base32、Base16类似的编码方式?
答案是肯定的,的确存在Base32和Base16这样的编码方案,规则上的差异也是显而易见的,主要存在两点差异:
差异点1 编码规则中分组的位数