Base64 格式的数据是如何实现的
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64哥可打印字符来表示二进制数据的方法。
对于前端来说,一切可以放路径的地方,都可以使用Base64来替代。
node中的buffer对象可以通过toString(‘base64’)将buffer对象输出为base64.我们这里来简述一下汉字转换成Base64的实现原理。
比如我们来探索一下汉字“哈”通过Base64的转换结果为“5ZOI”是如何实现的。
1、将字符串通过Buffer.from获取buffer,并将buffer中的每个16的buffer字节转为2进制
首先可以利用nodejs 中Buffer对象的from 方法,将汉字转换为buffer对象。 可以得到e5 93 88三个16进制的字节。可以看到这个函子由3个字节组成。
1 | const buf = Buffer.from("哈"); |
然后再将每个字节转换为二进制,0x代表16进制,我们需要再e5 93 88前面分别拼上0x,toString方法中可以传入要转换的字进制,这里写2.1
2
3
4// 将每个字节转为二进制
(0xe5).toString(2); // 11100101
(0x93).toString(2); // 10010011
(0x88).toString(2); // 10001000
2、将所有二进制拼接在一起,6个一组进行划分,在前面补00,凑成8位二进制
将得到的三个2进制的数据连接在一起,得到 111001011001001110001000 。然后每六个一组进行切割为4部分。1
111001 011001 001110 001000
接着 再每一组的前面用0补位,凑成8位1
2
3
400111001
00011001
00001110
00001000
3、将新的二进制转换成10进制
得到的四组数据分别再转换为10进制数据。这里一共可以获得4个数字。1
2
3
4paresInt('00111001', 2) // 二进制变为10进制 57
paresInt('00011001', 2) // 二进制变为10进制 25
paresInt('00001110', 2) // 二进制变为10进制 14
paresInt('00001000', 2) // 二进制变为10进制 8
4、在Base64集合中分别通过10进制下标取出,并链接
base64的编码数据基本是从A-Z加上a-z再加上0123456789+/ 中获取的。我们拼接出这个字符串。1
2
3
4// base64编码
let str = 'ABCDEFGHIGKLMNOPQRSTUVWSYZ';
str += str.toLowerCase(); // 小写字符拼接一次
str += '0123456789+/'; // 数字拼接一次
字符串可以类似数组一样通过下标来获取指定位置的字符,这里通过上面10进制转换之后的值分别获取对应位置的字符,57获取的就是5,
25获取的就是Z,14获取的就是O,8获取的就是I。
将这四个字符拼接在一起就是5ZOI。就是之前转换后的Base64。1
const base64 = str[57] + str[25] + str[14] + str[8]; // 5ZOI