背景
作用
- 主要为了减少网络请求,适合大规模在网站上运用的小图片,或者做包做库只用纯js看起来方便。
原理
- 原理很简单,拿到一个东西比如字符什么的,存到内存中都是二进制数据,在node里可以用buffer这个api来获得这个东西的16进制表示的二进制数据。
- node默认汉字是utf-8是3个字节,英文之类是一个字节,从buffer里取出几个数字就能看出。
- 把这个二进制数合起来按每6位进行分组,后面不足六位的补零。
- 每六位二进制转换为10进制,通过这个10进制数作为索引,去找对应的base64表。
代码
let base64Basic = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
base64Basic+=base64Basic.toLowerCase()
base64Basic+='0123456789+/'
function base64Encoding(target) {
let buffer = Buffer.from(target)
let sec = ''
buffer.map((item)=>{
let tmp = item.toString(2)
while(tmp.length<8){
tmp = '0'+tmp
}
return sec +=tmp
})
let secList =[]
if(sec.length%6!==0){
let tmp = sec.length%6
while(tmp<6){
sec+='0';
tmp+=1;
}
}
for(let i =0;i<Math.ceil((sec.length)/6);i++){
secList.push(sec.slice(i*6,i*6+6))
}
let res = secList.map((item)=>(parseInt(item,2)))
let fres = ''
res.map((item)=>(fres+=base64Basic[item]))
while(fres.length%4!==0){
fres+='='
}
return fres
}
console.log(base64Encoding('xzcxc'));
- 基本注释都有,那个base64Basic就是对应表,通用的是这个顺序。
- 可以通过在线验证base64编码网站看写的对不对。
- 为什么是6位?因为base64最多是2的6次方个数(0-63),对应上面密码表就是26个大写+26个小写+10个数字(0-9)+一个加号和一个斜杠。正好64个。