BASE64算法基于Typescript实现

本文详细介绍了Base64编码的基本原理和技术实现过程。通过具体步骤解释了如何将原始字符串转换为Base64编码格式,并提供了完整的TypeScript实现代码。特别关注了字符串到字节集合的转换、二进制表示及最终的Base64字符映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 base64编码效果

 注意细节:

1. 字符串转位集合

 let te = new TextEncoder();//实例化字符编码对象
 let byteArray = te.encode(toEncodeString);//字符串转编码集合

2.整数转换二进制

var b1 = byteArray[i * 3];    //第1个字节
var b2 = byteArray[i * 3+1];  //第2个字节
var b3 = byteArray[i * 3+2];  //第3个字节

//拼接3个字符8位数据为24位数据 x.toString(2) 为将x转换二进制 .padStart为向高位补0
s = b1.toString(2).padStart(8,'0') + b2.toString(2).padStart(8,'0') + b3.toString(2).padStart(8,'0');

3.进制转换整数

//分割24位数据,转换成4个6位,然后转换成整数
let p1 = data.substr(0, 6);
let p2 = data.substr(6, 6);
let p3 = data.substr(12, 6);
let p4 = data.substr(18, 6);

//编码一组3个字节为4字节, parseInt(x,2) 为将二进制x转换为整数
base64Str = alph[parseInt(p1,2)] + alph[parseInt(p2,2)] + alph[parseInt(p3,2)] + alph[parseInt(p4,2)];

完整源码:

console.log("BASE64算法基于TS实现");

let alph = [ 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
    'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
    '0','1','2','3','4','5','6','7','8','9','+','/'];

console.log(`BASE64字符表:${alph}`);

function  Base64Encode(toEncodeString){
    let te = new TextEncoder();//实例化字符编码对象
    let byteArray = te.encode(toEncodeString);//字符串转编码集合
    let len = toEncodeString.length;//取字符串数量

    let s = "";//临时使用的二进制字符串拼接
    let t = "";//输出base64字符串
    let base64Str = "";//临时转换的4位base64字符

    //取满足3字节,先编码
    for (let i = 0; i < Math.floor(len/3); i++)
    {
        var b1 = byteArray[i * 3];    //第1个字节
        var b2 = byteArray[i * 3+1];  //第2个字节
        var b3 = byteArray[i * 3+2];  //第3个字节

        //拼接3个字符8位数据为24位数据 x.toString(2) 为将x转换二进制 .padStart为向高位补0
        s = b1.toString(2).padStart(8,'0') + b2.toString(2).padStart(8,'0') + b3.toString(2).padStart(8,'0');

        let data = s;//保存24位数据
        s=null;
        //分割24位数据,转换成4个6位,然后转换成整数
        let p1 = data.substr(0, 6);
        let p2 = data.substr(6, 6);
        let p3 = data.substr(12, 6);
        let p4 = data.substr(18, 6);

        //编码一组3个字节为4字节, parseInt(x,2) 为将二进制x转换为整数
       base64Str = alph[parseInt(p1,2)] + alph[parseInt(p2,2)] + alph[parseInt(p3,2)] + alph[parseInt(p4,2)];

       t+=(base64Str);
    }

    //处理不足3字节数据
    if (len % 3 > 0)
    {
        let lastGroupLen = len % 3;
        let tmpBytes = [];
        if (lastGroupLen == 1)
        {
            tmpBytes[0] = byteArray[len-1];
            tmpBytes[1] = 0;
            tmpBytes[2] = 0;
        }
        if (lastGroupLen == 2)
        {
            tmpBytes[0] = byteArray[len - 2];
            tmpBytes[1] = byteArray[len - 1];
            tmpBytes[2] = 0;
        }

        s = tmpBytes[0].toString(2).padStart(8,'0') + tmpBytes[1].toString(2).padStart(8,'0') + tmpBytes[2].toString(2).padStart(8,'0');
        let data = s;
        s=null;

        //转换成4个6位,然后转换成整数  //011001 000000 000000 000000
        let p1 = data.substr(0, 6);
        let p2 = data.substr(6, 6);
        let p3 = data.substr(12, 6);
        let p4 = data.substr(18, 6);

        if (lastGroupLen==1)
        {
            //编码一组3个字节为4字节
            base64Str = alph[parseInt(p1,2)] + alph[parseInt(p2,2)] + "==";  //最后一组只有1位,补两个0
        }
        if (lastGroupLen == 2)
        {
            //编码一组3个字节为4字节
            base64Str = alph[parseInt(p1,2)] + alph[parseInt(p2,2)] + alph[parseInt(p3,2)] + "="  //最后一组只有2位,补1个0
        }
        t+=(base64Str);
    }
    console.log(`源码字符串: ${toEncodeString} -> BASE64字符串: ${t}`);
    return t;

}

Base64Encode("helloworld");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自由软件开发者

有你的鼓励,我会更加努力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值