面试偶尔会被问到,记录一下编码原理
- Base64 将每 3 个字节(24 位)的数据划分为一组,然后将这 24 位数据分为 4 个 6 位的分组。由于 6 位二进制数可以表示 0 - 63 这 64 个数字,所以每个 6 位分组可以用一个 Base64 字符来表示。
- 具体的字符集包括大写字母 A - Z(26 个)、小写字母 a - z(26 个)、数字 0 - 9(10 个)以及两个特殊字符 “+” 和 “/”,总共 64 个字符。
- 例如 →主要看这儿←,对于原始的二进制数据
01100001 01100010 01100011(这是字符 “abc” 的 ASCII 码对应的二进制表示),划分成 6 位一组后得到011000 010110 001001 100011,对应的十进制数分别为 24、22、9、51,在 Base64 字符集中对应的字符分别是 “Y”“W”“J”“z”,所以 “abc” 经过 Base64 编码后就是 “YWJj”。 - 如果原始数据的字节数不是 3 的倍数,那么会在末尾添加 1 个或 2 个
0字节来补齐,同时在编码后的字符串中用 “=” 字符表示添加的补齐字节。例如,原始数据只有 2 个字节,那么会添加 1 个0字节,编码后的字符串最后会有一个 “=”。
再整一个demo
- 以hello举例
Buffer.from('hello').toString('base64')
- 转为16进制
<Buffer 68 65 6c 6c 6f> - 转为2进制
01101000 01100101 01101100 01101100 01101111 - 每 3 个字节划分为一组(这里一共 5 个字节,所以最后一组不足 3 个字节会进行补齐操作)
- 第一组是
01101000 01100101 01101100对应hel=>68 65 6c- 将这 24 位数据划分为 4 个 6 位的分组,得到:
011010 000110 010101 101100,对应的十进制数分别为26、6、21、44。26、6、21、44对应Base64的字符集中的字符:a,G,V,s
- 第二组是
01101100 01101111对应lo=>6c 6f- 不足3个字节,则补齐为
01101100 01101111 00000000 - 将这 24 位数据划分为 4 个 6 位的分组,得到:
011011 000110 111100 000000,对应的十进制数分别为27、6、60、0。27、6、60、0对应Base64的字符集中的字符:b,G,8,=
- 不足3个字节,则补齐为
- 第一组是
- 所以最终的Base64编码为
aGVsbG8=,至此搞掂!