1、Base64编码实现原理
第一步:
原理是把每 3 个字节(每个字节为 8 位, 3 个字节为 24 位)重新划为 4 组(每组为 6位)
第二步:
重新划分的每组 6 位的字节中,高位补两个 0 为 8 位后作为一个新的 8 位字节,每个字节数值的范围是 00000000 - 00111111 即十进制的 0 - 63。有效位6位(最前两的两位为 0 ),即为2^6^,总共对应64个字符
第三步:
将划分后的字节的数值作为索引查编码表,获得相应的字符,从而得到编码后的字符串。通过 64 个字符来对任意数据进行编码,因此称为 Base64。
2、Base64索引查询编码表
3、示例说明
以字符串 “NEW” 为例,对其 Base64 编码:
如果要编码的字节数不能被 3 整除,最后会多出 1 个或 2 有效的字节。将这样处理,将其用 0 补充至 6 的最小倍数位后,剩余的空位将使用 “=” 填充处理。例如:
经过 Base64 编码后数据会增大,数据经过 Base64 处理后,由原来每 3 个字节,变为为 4 个字节,数据大小会变为原来的 4/3, 因此数据增大 1/3。
4、代码模拟实现base64算法
function base64encode(text) {
// base64 编码字符映射表
let base64Code =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
let res = "";
let i = 0;
while (i < text.length) {
let char1, char2, char3, enc1, enc2, enc3, enc4;
char1 = text.charCodeAt(i++);
char2 = text.charCodeAt(i++);
char3 = text.charCodeAt(i++);
enc1 = char1 >> 2; // 取第 1 字节的前 6 位
if (isNaN(char2)) {
// 只有 1 字节的时候
enc2 = ((char1 & 3) << 4) | (0 >> 4);
// 第65个字符用来代替补位的 = 号
enc3 = enc4 = 64;
} else if (isNaN(char3)) {
// 只有 2 字节的时候
enc2 = ((char1 & 3) << 4) | (char2 >> 4);
enc3 = ((char2 & 15) << 2) | (0 >> 6);
enc4 = 64;
} else {
enc2 = ((char1 & 3) << 4) | (char2 >> 4); // 取第 1 个字节的后 2 位(3 = 11 << 4 = 110000) + 第 2 个字节的前 4 位
enc3 = ((char2 & 15) << 2) | (char3 >> 6); // 取第 2 个字节的后 4 位 (15 = 1111 << 2 = 111100) + 第 3 个字节的前 2 位
enc4 = char3 & 63; // 取最后一个字节的最后 6 位 (63 = 111111)
}
res +=
base64Code.charAt(enc1) +
base64Code.charAt(enc2) +
base64Code.charAt(enc3) +
base64Code.charAt(enc4);
}
return res;
}
console.log(base64encode('NEW'));
console.log(base64encode('NE'));
console.log(base64encode('N'));