base64 原理

250 阅读2分钟

base64

一般情况下, base64 可以转化 png,jpg等图片,在webpack中有对应的 loader 转化 大小比较小的 图片,一直没弄懂原理

Base64 编码原理

接下来我们通过将 abcd二字转为 Base64 编码,来了解下它的原理。

  1. 把字符三三分组,不够时通过 0 补齐。比如 abc三个字符归一组,d 不够三位,通过 0 补齐为 d00

图片

  1. 把字符转换成二进制 ASCII 编码 (anytexteditor.com/cn/ascii-to…) ascii 对照表 图片 就是不断的取余,如果不足8位,前面补充 0
function getTwo(num) {
  let res = [];
  while (num >= 1) {
    res.push(num % 2)
    num = Math.floor(num / 2)
  }
  return res.reverse()
}
  1. 把转换后的二进制,每六位分隔开

图片

Q:为什么第一步需要分三个字符一组?

A:因为 ASCII 码每个字符是 8 位二进制,3 * *8 = 24。正好可以被第三步拆分为 4 个 6 位二进制,4 ** 6 = 24。

  1. 6 位二进制能代表 0-63,我们有一个彩虹表,可以将 0-63 分别对应一个字符,彩虹表如下:

图片

通过彩虹表,我们可以将每 6 位分割后的二进制做一次转换

图片

需要注意的是,凡是补位产生的 0,需要用 = 来表示。所以最后的两位都是 =

最后 abcd 转换为 Base64 编码后为 YWJjZA==,整体原理还是比较简单的,不涉及到高深的算法。

Base64 周边

  1. 由于 Base64 转码后会包含 +/=字符,在 URL 不能正常传输。所以有一种 URL 友好型的 Base64 编码,它存在使用 _-来代替 +/,并且不在末尾追加 =
  2. Base32、Base16 的原理和 Base64 基本一致
  3. Base64 并不适合加密,因为解密太简单了
  4. 汉字通过 gb2312utf-8gbk编码后,即可转成二进制处理。这里借用网上的一个图片说明:图片

eg

// 用 tsk 来解析
tsk 是三个字符,只需要一组, t对应的是 45
转化成 二进制为
01110100 01110011 01101011
然后分成 6个一组
011101 000111 001101 101011
然后对照彩虹表
d H N r

转化base64 的网址

note:原文链接:mp.weixin.qq.com/s/vHyXPsqqj…; date:2022.6.15