关于什么是base64,以及编译流程

156 阅读3分钟

面试偶尔会被问到,记录一下编码原理

  • 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,=
  • 所以最终的Base64编码为 aGVsbG8=,至此搞掂!