Base64 就是将字符串变成 以 A~Z a~z 1234567890 +/ 共64个字符 进行编码
1. 将需要编码的字符串变成二进制
- 1个字符 = 1个字节 = 8位二进制数 而 2的8次方= 64 刚好对应64个字符
2. 按每6位截取上一步中获取的二进制字符串 末尾不足6位的补0
3. 返回对应的base64编码
实现代码
function getBase64Code(){ // 获取 base64 编码集 A到Z a到z 0到9 再加上 +/
const AZ = new Array(26).fill(65).map((item, index) => {
return String.fromCodePoint(item + index);
// 返回 大写字母 A 到 Z //65 是 A 的 unicode 编码
// fromCodePoint()函数 将unicode编码变成 字符
}).join('');
const az = new Array(26).fill(97).map((item, index) => {
return String.fromCodePoint(item + index);
}).join(''); // 返回 a 到 z
return AZ + az + '0123456789+/'; // ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ 共64个字符
}
function toBase64(str = '') {
let base64Code = getBase64Code();
let enCode = '';
let buWeiDengHao = '';
// 将每一个字符先变为 UniCode 编码(数字) 再使用 toString 返回其数字的二进制字符串;
let code = str.split('').reduce((prev, cur) => {
let oneWord = cur.charCodeAt().toString(2);
oneWord = oneWord.padStart(8, '0');
// 在base64中 一个字符 = 1个字节 = 8位 所以这里以0 补位 补足8位
// 2的8次方刚好是64 所以能够和base64编码 一一对应
return prev + oneWord;
}, '');
let item = '';
for(let i = 0; i < code.length; i += 6){ // 以6位的方式截取这个二进制字符串
// console.log(i, i + 6);
item = code.slice(i, i + 6);
if(item.length < 6){ // 不足6位的需要补位 8 和 6 的最大公约数 是 2 则 只会存在 补 2位 和 补4位的情况
if(item.length === 2){ //
item += '0000';
buWeiDengHao += '=='; // 补4位 要在结尾加2个等号
}
if(item.length === 4){
item += '00';
buWeiDengHao += '='; // 补2位 要在结尾加1个等号
}
}
enCode += base64Code[parseInt(item, 2)]; // 二进制字符串变成变成10进制 获取数字的索引
// 不足6位时 需要补位
}
return enCode + buWeiDengHao;
}
console.log(toBase64('ajksldjslfdg8490568945806()'));