用代码实现把字符串转换成 base64 编码

发布于 2023-05-03 21:02:16 字数 1765 浏览 36 评论 0

1. btoa

btoa(unescape(encodeURIComponent(this.inText)));

2. 手动实现

function stringToBase64(str) {
    // 将字符串转换为二进制数组
    let binaryArr = [];
    for (let i = 0; i < str.length; i++) {
      binaryArr.push(str.charCodeAt(i));
    }
    // 将二进制数组转换为base64字符串
    let base64Str = '';
    const base64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    for (let i = 0; i < binaryArr.length; i += 3) {
      let b1 = binaryArr[i];
      let b2 = i + 1 < binaryArr.length ? binaryArr[i + 1] : 0;
      let b3 = i + 2 < binaryArr.length ? binaryArr[i + 2] : 0;
      let c1 = b1 >> 2;
      let c2 = ((b1 & 0x03) << 4) | (b2 >> 4);
      let c3 = ((b2 & 0x0f) << 2) | (b3 >> 6);
      let c4 = b3 & 0x3f;
      base64Str += base64Table[c1] + base64Table[c2] + base64Table[c3] + base64Table[c4];
    }
    // 补全base64字符串的结尾
    let paddingCount = (3 - binaryArr.length % 3) % 3;
    base64Str = base64Str.slice(0, base64Str.length - paddingCount);
    for (let i = 0; i < paddingCount; i++) {
      base64Str += '=';
    }
    return base64Str;
}

console.log(stringToBase64('hello world') === btoa('hello world'))

Base64 编码是基于 64 个字符 A-Z、a-z、0-9、+、/ 的编码方式,因为2的6次方正好为 64,所以就用 6bit 就可以表示出64个字符,000000 对应 A,000001 对应 B

以每 3 个 字符(1Byte = 8bit)为一组,然后针对每组,首先获取每个字符的 ASCII 编码(字符 'a'=97=01100001 ),然后将 ASCII 编码转换成 8 bit 的二进制,得到一组 3 * 8 = 24 bit 的字节。然后再将这 24 bit 划分为 4 个 6 bit 的字节,并在每个 6 bit 的字节前面都填两个高位 0,得到 4 个 8 bit 的字节,然后将这 4 个 8 bit 的字节转换成十进制,对照 BASE64 编码表 ,得到对应编码后的字符,空位不足补=

解码

将4个字节转换成3个字节,先读入4个6位(用或运算),每次左移6位,再右移3次,每次8位,这样就还原了

注意

base64 不支持中文,所以需要先编码 encodeURI 即可

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

蓝天

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

wanghao

文章 0 评论 0

蓝天

文章 0 评论 0

handsomedeng

文章 0 评论 0

仙女

文章 0 评论 0

石海龙

文章 0 评论 0

dianjvnan

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文