Base64编码和解码在客户端JavaScript

JavaScript中是否有可用于使用base64编码对string进行编码和解码的方法?

一些浏览器,如Firefox,Chrome,Safari,Opera和IE10 +可以本地处理Base64。 看看这个Stackoverflow的问题 。 它使用btoa()atob()函数 。

对于服务器端JavaScript, Node.JS有一个btoa包 。

如果你正在寻找一个跨浏览器的解决scheme,像CryptoJS这样的现有库或代码如下:

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

对于后者,您需要彻底testing跨浏览器兼容性的function。 错误已经被报告 。

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

原来的答案: 如何编码一个string在JavaScript中的Base64?

这是一个收紧的版本的狙击手的职位。 它假设格式良好的base64string,没有回车。 这个版本消除了几个循环,增加了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; }; 

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!" 

跨浏览器

为AMD,CommonJS,Nodejs和浏览器重新编写和模块化的UTF-8和Base64 Javascript编码和解码库/模块。 跨浏览器兼容。


与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编码的string:

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

与Dojo.js

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

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

解码base64编码的string:

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

凉亭安装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,我会推荐这篇文章: JavaScript中的计算机科学:Base64编码

短而快的Base64 JavaScript解码function,无故障保护:

 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; } 

这里是使用javascript base64_encode和base64_decode的最佳方法。 看下面的链接。

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

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

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

我已经尝试在phpjs.org的Javascript例程,他们工作得很好。

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

我发现他们在任何情况下都不工作。 我写了一个testing用例,这些例程失败并将它们发布到GitHub上:

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

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

有人说代码高尔夫? =)

以下是我努力改善自己的障碍,追赶时代。 为您提供方便。

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

我后面实际上是一个asynchronous实现,令我惊讶的是forEach ,而不是JQuery的$([]).each方法的实现是非常同步的。

如果你也有这样一个疯狂的概念,记住0延迟window.setTimeout将asynchronous运行base64解码,并执行callback函数与结果完成后。

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

forEach是ECMA-262标准的第5版,如果你关心浏览器的延迟,你可能希望多function填充它们,或者你也可以像ECMAScript 6 Harmony项目那样完成ES5到ES6的完整转换为你。

但是如果你正在寻找一些更传统的东西,或许以下更符合你的口味。

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

我没有拖尾null的问题,所以这被删除保持低于标准杆,但它应该很容易用trim()trimRight()如果你愿意解决,如果这对你构成一个问题。

即。

 return r.trimRight(); 

的nJoy!

 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 

我宁愿使用来自CryptoJS的bas64编码/解码方法, CryptoJS是使用最佳实践和模式在JavaScript中实现的最stream行的标准和安全encryptionalgorithm库。