首先,我们要树立两个基本认知。
二进制图片不能直接以字符串形式存在 .js 文件中,因为直接用 ASCII (美国信息交换标准代码)表示的二进制字符串太大了。一个二进制 “00000000”,占 8 比特大小,也就是 1 个字节的大小。一个直接用 ASCII 表示的字符串 “00000000”,占 8*8 比特大小,也就是 8 个字节的大小,是二进制大小的 8 倍。
二进制图片不能直接以 ASCII 的格式转换为字符串,这是因为 ASCII 字符集不仅存在可见字符,还存在不可见字符。例如,二进制 “00000000” 对应的 ASCII 字符是“空字符(Null)”,空字符是不可见字符。
但是,二进制图片可以借助 Base64 进行转换。Base64 从 ASCII 256 个字符中选取了 64 个可见字符作为基础,这样就二进制就能以 Base64 的格式转换为 ASCII 字符串了。例如,二进制 00000000 对应的 Base64 字符是 A,是可见字符,可见字符 A 是可以存在在 .js 文件中的。
需要注意的是,ASCII 256 个字符需要 8 个比特来表示(2^8=256),Base64 的 64 个字符只需要 6 个比特位来表示(2^6=64)。但实际上,Base64 字符也是以 ASCII 码的形式存在,因此这里就有 2 个比特的浪费(8-6=2)。
你可以再仔细观察一下前面我提供的 Base64 转换的原理示意图,相信你一下就能明白其中原理。Base64 以 3 个字节作为一组,一共是 24 比特。将这 24 个比特分成 4 个单元,每个单元 6 个比特。每个单元前面加 2 个 0 作为补位,一共 8 个比特,凑整 1 个字符。转换后原来的 24 比特,就变成了 32 比特,因此转换后的体积就大了 1/3( 1/3 = 1 - 24/32)。