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

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日

相关文章

  • 详解操作cookie的原生方法cookieStore

    操作cookie是前端开发中经常会涉及到的技能之一。cookieStore是一个原生的JavaScript对象,它提供了一些方法来操作cookie。本攻略将详解cookieStore的使用方法。 获取cookie 使用cookieStore的get方法可以获取指定的cookie值。示例如下: const cookieValue = cookieStore.g…

    JavaScript 2023年6月11日
    00
  • 犀利的js 函数集合

    犀利的JS函数集合 介绍 犀利的JS函数集合是一些实用的JavaScript函数合集,可以帮助开发人员更高效地编写JavaScript代码。 安装 本函数集合可以直接在浏览器中使用,在HTML中引入js文件即可开始使用。 <script src="sharpjs.js"></script> 使用 类型判断: sha…

    JavaScript 2023年5月27日
    00
  • jquery中animate动画积累的解决方法

    标题:jQuery中animate动画积累的解决方法 问题: 在使用jQuery的animate()方法时,我们可能会遇到动画积累的问题。比如,当我们多次点击一个按钮触发动画时,如果每次点击都会开始一个新的动画,那么这些动画就会重叠在一起,导致页面出现意外的效果。那么,如何解决这个问题呢? 解决方法: jQuery提供了一个stop()方法,可以用于停止、清…

    JavaScript 2023年6月11日
    00
  • js报$ is not a function 的问题的解决方法

    问题描述: 当你在使用 jQuery 时,可能会遇到类似于” $ is not a function ” 的报错信息,这意味着代码尝试调用一个名为 $ 的函数,但是这个函数并未定义或者没有被正确加载。 解决方法: 引入 jQuery 库 请确保你已经在 HTML 文件中引入了 jQuery 库,可以通过以下方式引入: <script src=&quot…

    JavaScript 2023年5月18日
    00
  • JavaScript 封装Ajax传递的数据代码

    当我们需要使用Ajax进行数据传递时,通过JavaScript封装以实现数据传递是非常常见的做法。下面是一份完整的JavaScript封装Ajax传递数据的攻略。 攻略步骤 创建一个XMLHttpRequest对象 使用JavaScript中的XMLHttpRequest对象,用于与服务器进行交互。可以通过new XMLHttpRequest()方法来创建一…

    JavaScript 2023年6月1日
    00
  • JavaScript内置日期、时间格式化时间实例代码

    让我来为您详细讲解一下 “JavaScript内置日期、时间格式化时间实例代码” 的完整攻略。 什么是日期、时间格式化? 格式化是指将一个变量的值以一定的格式输出。在 JavaScript 中,我们可以使用内置的 Date() 对象和相关方法进行日期、时间格式化。 如何使用内置日期、时间格式化实例代码? 获取当前时间 获取当前时间的方式有两种,分别是使用 n…

    JavaScript 2023年5月27日
    00
  • vue调用本地摄像头实现拍照功能

    下面我将详细讲解“vue调用本地摄像头实现拍照功能”的完整攻略。 1. 添加依赖库 首先需要引入vue-web-cam库,它提供了调用本地摄像头的功能。可以通过如下命令安装: npm install vue-web-cam 2. 实现拍照功能 接下来,我们需要在组件中实现拍照功能。这里提供两种示例。 示例 1:使用原生的HTML和JavaScript实现拍照…

    JavaScript 2023年6月11日
    00
  • 理解javascript函数式编程中的闭包(closure)

    理解 javascript 函数式编程中的闭包(closure)可以分为以下几个步骤: 什么是闭包? 闭包是指一个函数访问了自己定义的外部函数的作用域中的变量。简单来说,就是在一个函数内部可以访问另一个函数作用域中的变量。在 JavaScript 中,当一个函数定义在另一个函数内部时,就会形成一个闭包。 闭包的使用 保存私有变量 闭包可以用来定义私有变量。这…

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