Base64编码原理和代码实现

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'));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值