JS 实现Base64编码与解码实例详解

yizhihongxing

JS 实现Base64编码与解码实例详解

Base64是一种将二进制数据编码为ASCII字符的方法。通过该编码方式,可以将二进制数据以可读的方式在不同系统中传输或储存。

什么是Base64

在计算机中,数据存储都是以二进制位(bit)为单位的,但是在我们人类的角度下,二进制是很难读懂的,如00101011。因此为了呈现数据,可以采用16进制、ASCII等方式展示。其中,ASCII编码规范中利用7位二进制编码一个字符,可表示128种不同的字符。

而Base64就是由64个字符(A-Za-z0-9+/)组成的一种编码方式,它的作用就是将二进制数据转换成可读的ASCII字符。

Base64的编码和解码实现

1.编码

Base64的编码方式很简单,首先需要将原始数据转化为二进制数据,然后将其分割成6个一组的数据,最后在前面加上一段开头为字符“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/” 、长度为64的字符表示Base64的参数表。将获取的每个分组的数值转化为十进制数,然后将十进制数转化为ASCII字符。最后依次得到的ASCII字符组成的字符串就是Base64编码后的结果。

下面是一段实现Base64编码的函数示例:

function encodeBase64(str) {
    //1.定义Base64编码表
    var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    //2.将UTF-8字符串转义为二进制字符串
    var out, i, len;
    var c1, c2, c3;
    len = str.length;
    i = 0;
    out = "";
    while (i < len) {
        c1 = str.charCodeAt(i++) & 0xff;
        if (i == len) {
            out += base64EncodeChars.charAt(c1 >> 2);
            out += base64EncodeChars.charAt((c1 & 0x3) << 4);
            out += "==";
            break;
        }
        c2 = str.charCodeAt(i++);
        if (i == len) {
            out += base64EncodeChars.charAt(c1 >> 2);
            out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
            out += base64EncodeChars.charAt((c2 & 0xF) << 2);
            out += "=";
            break;
        }
        c3 = str.charCodeAt(i++);
        out += base64EncodeChars.charAt(c1 >> 2);
        out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
        out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
        out += base64EncodeChars.charAt(c3 & 0x3F);
    }
    return out;
}

2.解码

解码的过程首先是将Base64编码之后的字符串转化为二进制数据,然后将其以6个一组的形式分割,再将每个分组先转化为十进制数,再将十进制数转化为二进制数据,最后将二进制数据转化为UTF-8字符串即可。

下面是一段实现Base64解码的函数示例:

function decodeBase64(str) {
    //1.定义Base64编码表
    var base64DecodeChars = new Array(
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
        -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
        52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
        -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
        16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63, -1,
        26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
        42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, -1
    );

    //2.将Base64字符串转为二进制输入流
    var c1, c2, c3, c4;
    var i, len, out;
    len = str.length;
    i = 0;
    out = "";
    while (i < len) {
        do {
            c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
        } while (i < len && c1 == -1);
        if (c1 == -1)
            break;

        do {
            c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
        } while (i < len && c2 == -1);
        if (c2 == -1)
            break;

        out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));

        do {
            c3 = str.charCodeAt(i++) & 0xff;
            if (c3 == 61)
                return out;
            c3 = base64DecodeChars[c3];
        } while (i < len && c3 == -1);
        if (c3 == -1)
            break;

        out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));

        do {
            c4 = str.charCodeAt(i++) & 0xff;
            if (c4 == 61)
                return out;
            c4 = base64DecodeChars[c4];
        } while (i < len && c4 == -1);
        if (c4 == -1)
            break;

        out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
    }
    return out;
}

Base64编码与解码实例

下面我们提供两个Base64编码与解码实例,以便更好的理解其实现原理。

示例1

下面的代码展示如何将一张图片文件转化为Base64编码形式,并在HTML中展示该图片:

<html>
    <head><title>Base64图片展示示例</title></head>
    <body>
        <script>
            function getImageBase64() {
                var file = document.getElementById('image').files[0];
                if (file) {
                    var reader = new FileReader();
                    reader.readAsDataURL(file);
                    reader.onload = function(event) {
                        document.getElementById('showImage').innerHTML = '<img src="' + event.target.result + '"/>';

                        //将Base64编码结果存在textarea中
                        document.getElementById('base64Code').value = event.target.result;
                    }
                }
            }
        </script>
        <h1>Base64图片展示示例</h1>
        <input type="file" id="image" onchange="getImageBase64();" />
        <div id="showImage"></div>
        <textarea id="base64Code"></textarea>
    </body>
</html>

其中,利用FileReader对象读取图片文件,利用onload事件及img[src]定义样式展示图片,同时利用textarea将图片内容以Base64编码的方式展示出来。

示例2

下面的示例展示Base64编码和解码的过程:

var str = "Hello world!";
var base64Code = encodeBase64(str);
console.log("原始字符串:" + str);
console.log("Base64编码:" + base64Code);

var decodeStr = decodeBase64(base64Code);
console.log("解码后字符串:" + decodeStr);

运行该代码,可以看到以下输出结果:

原始字符串:Hello world!
Base64编码:SGVsbG8gd29ybGQh
解码后字符串:Hello world!

总结

Base64编码与解码是数据传输及存储中常用的方式,在不同的编程语言中均有实现。通过本篇文章,我们详细讲解了Base64的编码和解码原理及实现,并提供了两个实际的代码示例,相信读者可以在实际应用中更好地掌握Base64的使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS 实现Base64编码与解码实例详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月27日

相关文章

  • vue-cli4项目开启eslint保存时自动格式问题

    下面是“vue-cli4项目开启eslint保存时自动格式问题”的完整攻略。 1. 安装必要依赖 首先,我们需要安装一些必要的依赖,以支持Eslint的自动格式化功能。具体操作如下: 安装Eslint相关依赖 npm install eslint –save-dev npm install eslint-plugin-vue –save-dev npm …

    JavaScript 2023年6月10日
    00
  • 推荐一个javascript的加密工具

    当我们需要在前端对一些敏感信息进行加密时,常常会使用JavaScript的加密工具。这里推荐两个常用的JavaScript加密工具。 1. CryptoJS CryptoJS是一个JavaScript加密器,它提供了多种加密算法,如AES、DES、Rabbit、MD5、SHA、HMAC等等。下面我们以AES加密为例,讲解使用CryptoJS进行加密的步骤。 …

    JavaScript 2023年5月19日
    00
  • 分离式javascript取当前element值的代码

    下面是关于“分离式javascript取当前element值的代码”的攻略。 什么是分离式javascript 分离式javascript是网页开发中常用的一种技术,它将网页中的代码和行为分离开来,使得代码更易于维护和管理。一般来说,分离式javascript代码会以单独的.js文件的形式存放在服务器上,例如: <script src="js…

    JavaScript 2023年6月10日
    00
  • Ajax发送和接收二进制字节流数据的方法

    发送和接收二进制字节流数据是通过Ajax传输数据的一种常见方式。下面是一整套完整的Ajax发送和接收二进制字节流数据的攻略。 准备工作 在发送和接收二进制字节流数据之前,你需要先准备好以下工作: 确保你的Web服务器能够正确处理二进制数据请求。可以通过查看服务器的文档或者咨询服务器提供商来确认。 确定好要发送或接收的二进制数据的格式和编码方式。常见的二进制数…

    JavaScript 2023年6月11日
    00
  • JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享

    JavaScript 中函数参数的传递方式既有值传递(by value),也有引用传递(by reference)。 值传递 函数参数以基本数据类型(如Number、String、Boolean等)为例,是以值传递的方式进行的。值传递表示将实际传递给函数的参数值(即实参)复制一份,传递给函数中对应的参数(即形参),函数中对参数值的修改不会影响到实参的值 下面…

    JavaScript 2023年5月27日
    00
  • Javarscript中模块(module)、加载(load)与捆绑(bundle)详解

    Javascript中模块(module)、加载(load)与捆绑(bundle)详解 Javascript的模块化开发在现代Web开发中已经成为了标准配置。在Javascript的模块化开发中,常见的术语包括模块、加载和捆绑。 模块(Module) 模块是Javascript中包含一组功能的单独文件或代码块。每个模块都拥有自己的作用域,并且只对外暴露为公共…

    JavaScript 2023年5月27日
    00
  • 浅谈JS正则表达式的RegExp对象和括号的使用

    浅谈JS正则表达式的RegExp对象和括号的使用 正则表达式是一种用来精确匹配字符串的工具,而JavaScript中的RegExp对象可以帮助我们在代码中使用正则表达式。 RegExp对象 在JavaScript中,RegExp对象可以通过构造函数创建: // 创建正则表达式 const regex = new RegExp(‘ab+c’); // 或者 c…

    JavaScript 2023年6月10日
    00
  • Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用

    一、什么是jQuery Ajax? jQuery Ajax是一组用于处理Ajax请求的方法和函数。通过它可以实现异步获取数据和处理数据的功能,可以向服务器发送请求以及在不刷新页面的情况下接收来自服务器的响应数据,从而实现网页动态更新的效果。 二、向WebService发出请求,返回泛型集合数据的异步调用 在使用jQuery Ajax与Web Service交…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部