base64
一般情况下, base64 可以转化 png,jpg等图片,在webpack中有对应的 loader 转化 大小比较小的 图片,一直没弄懂原理
Base64 编码原理
接下来我们通过将 abcd二字转为 Base64 编码,来了解下它的原理。
- 把字符三三分组,不够时通过 0 补齐。比如
abc三个字符归一组,d不够三位,通过0补齐为d00
- 把字符转换成二进制 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()
}
- 把转换后的二进制,每六位分隔开
Q:为什么第一步需要分三个字符一组?
A:因为 ASCII 码每个字符是 8 位二进制,3 * *8 = 24。正好可以被第三步拆分为 4 个 6 位二进制,4 ** 6 = 24。
- 6 位二进制能代表
0-63,我们有一个彩虹表,可以将 0-63 分别对应一个字符,彩虹表如下:
通过彩虹表,我们可以将每 6 位分割后的二进制做一次转换
需要注意的是,凡是补位产生的 0,需要用 = 来表示。所以最后的两位都是 =
最后 abcd 转换为 Base64 编码后为 YWJjZA==,整体原理还是比较简单的,不涉及到高深的算法。
Base64 周边
- 由于
Base64转码后会包含+/=字符,在 URL 不能正常传输。所以有一种 URL 友好型的 Base64 编码,它存在使用_-来代替+/,并且不在末尾追加= - Base32、Base16 的原理和 Base64 基本一致
- Base64 并不适合加密,因为解密太简单了
- 汉字通过
gb2312、utf-8、gbk编码后,即可转成二进制处理。这里借用网上的一个图片说明:
eg
// 用 tsk 来解析
tsk 是三个字符,只需要一组, t对应的是 45
转化成 二进制为
01110100 01110011 01101011
然后分成 6个一组
011101 000111 001101 101011
然后对照彩虹表
d H N r
note:原文链接:mp.weixin.qq.com/s/vHyXPsqqj…; date:2022.6.15