首页 文章

在客户端Javascript中进行Base64编码和解码

提问于
浏览
208

JavaScript中是否有任何方法可用于使用base64编码对字符串进行编码和解码?

12 回答

  • 166

    某些浏览器(如Firefox,Chrome,Safari,Opera和IE10)可以本机处理Base64 . 看看这个Stackoverflow question . 它正在使用btoa() and atob() functions .

    对于服务器端JavaScript,有一个btoa package for Node.JS .

    如果您要使用跨浏览器解决方案,可以使用现有的库,如CryptoJS或类似代码:

    http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html

    对于后者,您需要彻底测试该功能以实现跨浏览器兼容性 . 并且错误has already been reported .

  • 63

    在基于Gecko / WebKit的浏览器(Firefox,Chrome和Safari)和Opera中,您可以使用btoa()atob() .

    原答案:How can you encode a string to Base64 in JavaScript?

  • 1

    Internet Explorer 10

    // Define the string
    var string = 'Hello World!';
    
    // Encode the String
    var encodedString = btoa(string);
    console.log(encodedString); // Outputs: "SGVsbG8gV29ybGQh"
    
    // Decode the String
    var decodedString = atob(encodedString);
    console.log(decodedString); // Outputs: "Hello World!"
    

    跨浏览器

    Re-written and modularized UTF-8 and Base64 Javascript Encoding and Decoding Libraries / Modules for AMD, CommonJS, Nodejs and Browsers. Cross-browser compatible.


    带有Node.js的

    以下是在Node.js中将普通文本编码为base64的方法:

    //Buffer() requires a number, array or string as the first parameter, and an optional encoding type as the second parameter. 
    // Default is utf8, possible encoding types are ascii, utf8, ucs2, base64, binary, and hex
    var b = new Buffer('JavaScript');
    // If we don't use toString(), JavaScript assumes we want to convert the object to utf8.
    // We can make it convert to other formats by passing the encoding type to toString().
    var s = b.toString('base64');
    

    以下是解码base64编码字符串的方法:

    var b = new Buffer('SmF2YVNjcmlwdA==', 'base64')
    var s = b.toString();
    

    与Dojo.js

    使用dojox.encoding.base64编码字节数组:

    var str = dojox.encoding.base64.encode(myByteArray);
    

    要解码base64编码的字符串:

    var bytes = dojox.encoding.base64.decode(str)
    

    bower安装angular-base64

    <script src="bower_components/angular-base64/angular-base64.js"></script>
    
    angular
        .module('myApp', ['base64'])
        .controller('myController', [
    
        '$base64', '$scope', 
        function($base64, $scope) {
    
            $scope.encoded = $base64.encode('a string');
            $scope.decoded = $base64.decode('YSBzdHJpbmc=');
    }]);
    

    但是怎么样?

    如果您想了解更多关于base64如何编码的信息,特别是在JavaScript中,我会推荐这篇文章:Computer science in JavaScript: Base64 encoding

  • 7

    这是一个收紧版本的狙击手的帖子 . 它假设格式良好的base64字符串没有回车符 . 这个版本消除了几个循环,添加了Yaroslav的 &0xff 修复,消除了尾随空值,加上一些代码高尔夫 .

    decodeBase64 = function(s) {
        var e={},i,b=0,c,x,l=0,a,r='',w=String.fromCharCode,L=s.length;
        var A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        for(i=0;i<64;i++){e[A.charAt(i)]=i;}
        for(x=0;x<L;x++){
            c=e[s.charAt(x)];b=(b<<6)+c;l+=6;
            while(l>=8){((a=(b>>>(l-=8))&0xff)||(x<(L-2)))&&(r+=w(a));}
        }
        return r;
    };
    
  • 11

    短而快的Base64 JavaScript解码函数,没有Failsafe:

    function decode_base64 (s)
    {
        var e = {}, i, k, v = [], r = '', w = String.fromCharCode;
        var n = [[65, 91], [97, 123], [48, 58], [43, 44], [47, 48]];
    
        for (z in n)
        {
            for (i = n[z][0]; i < n[z][1]; i++)
            {
                v.push(w(i));
            }
        }
        for (i = 0; i < 64; i++)
        {
            e[v[i]] = i;
        }
    
        for (i = 0; i < s.length; i+=72)
        {
            var b = 0, c, x, l = 0, o = s.substring(i, i+72);
            for (x = 0; x < o.length; x++)
            {
                c = e[o.charAt(x)];
                b = (b << 6) + c;
                l += 6;
                while (l >= 8)
                {
                    r += w((b >>> (l -= 8)) % 256);
                }
             }
        }
        return r;
    }
    
  • 41

    php.js项目具有许多PHP函数的JavaScript实现 . 包括 base64_encodebase64_decode .

  • 6

    这是使用javascript base64_encode和base64_decode的最佳方法 . 见下面的链接 .

    http://phpjs.org/functions/base64_encode:358

    http://phpjs.org/functions/base64_decode:357

  • 7
    function b64_to_utf8( str ) {
      return decodeURIComponent(escape(window.atob( str )));
    }
    
     https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#The_.22Unicode_Problem.22
    
  • 30

    有人说代码高尔夫吗? =)

    以下是我在追赶时代的同时改善差点的尝试 . 供您方便使用 .

    function decode_base64(s) {
      var b=l=0, r='',
      m='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
      s.split('').forEach(function (v) {
        b=(b<<6)+m.indexOf(v); l+=6;
        if (l>=8) r+=String.fromCharCode((b>>>(l-=8))&0xff);
      });
      return r;
    }
    

    我实际上是一个异步实现,令我惊讶的是,事实证明 forEach 与JQuery的 $([]).each 方法实现非常同步 .

    如果您还有这样的疯狂概念,那么0延迟 window.setTimeout 将异步运行base64解码并在完成后执行带有结果的回调函数 .

    function decode_base64_async(s, cb) {
      setTimeout(function () { cb(decode_base64(s)); }, 0);
    }
    

    @Toothbrush建议"index a string like an array",并摆脱 split . 这个例程似乎很奇怪,并且不确定它会有多兼容,但它确实击中了另一只小鸟,所以让我们拥有它 .

    function decode_base64(s) {
      var b=l=0, r='',
      m='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
      [].forEach.call(s, function (v) {
        b=(b<<6)+m.indexOf(v); l+=6;
        if (l>=8) r+=String.fromCharCode((b>>>(l-=8))&0xff);
      });
      return r;
    }
    

    在尝试查找有关JavaScript字符串作为数组的更多信息时,我偶然发现了这个专业提示,使用 /./g 正则表达式来逐步执行字符串 . 通过替换现有的字符串并消除保留返回变量的需要,这可以进一步减少代码大小 .

    function decode_base64(s) {
      var b=l=0,
      m='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
      return s.replace(/./g, function (v) {
        b=(b<<6)+m.indexOf(v); l+=6;
        return l<8?'':String.fromCharCode((b>>>(l-=8))&0xff);
      });
    }
    

    如果您正在寻找更传统的东西,或许以下更符合您的口味 .

    function decode_base64(s) {
      var b=l=0, r='', s=s.split(''), i,
      m='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
      for (i in s) {
        b=(b<<6)+m.indexOf(s[i]); l+=6;
        if (l>=8) r+=String.fromCharCode((b>>>(l-=8))&0xff);
      }
      return r;
    }
    

    我没有尾随空问题所以这被删除以保持低于标准但如果您愿意,应该使用 trim()trimRight() 轻松解决,如果这对您造成问题 .

    即 .

    return r.trimRight();
    

    注意:

    结果是一个ascii字节字符串,如果你需要unicode,最简单的是 escape 字节字符串然后可以用 decodeURIComponent 解码以产生unicode字符串 .

    function decode_base64_usc(s) {      
      return decodeURIComponent(escape(decode_base64(s)));
    }
    

    由于 escape 被弃用,我们可以更改我们的函数以直接支持unicode,而不需要 escapeString.fromCharCode 我们可以生成一个 % 转义字符串,准备进行URI解码 .

    function decode_base64(s) {
      var b=l=0,
      m='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
      return decodeURIComponent(s.replace(/./g, function (v) {
        b=(b<<6)+m.indexOf(v); l+=6;
        return l<8?'':'%'+(0x100+((b>>>(l-=8))&0xff)).toString(16).slice(-2);
      }));
    }
    

    的nJoy!

  • 10

    我在phpjs.org上尝试过Javascript例程,但它们运行良好 .

    我首先尝试了Ranhiru Cooray选择的答案中建议的例程 - http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html

    我发现它们在所有情况下都不起作用 . 我编写了一个测试用例,这些例程失败并将它们发布到GitHub:

    https://github.com/scottcarter/base64_javascript_test_data.git

    我还在ntt.cc的博客文章上发表评论,提醒作者(等待审核 - 文章已经过时,所以不确定是否会发布评论) .

  • 0

    我宁愿使用CryptoJS中的bas64编码/解码方法,这是最流行的标准和安全加密算法库 . JavaScript使用最佳实践和模式 .

  • 36

    在Node.js中,我们可以用简单的方式完成它

    var base64 = 'SGVsbG8gV29ybGQ='
    var base64_decode = new Buffer(base64, 'base64').toString('ascii');
    
    console.log(base64_decode); // "Hello World"
    

相关问题