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的最佳方法。 看下面的链接。
php.js项目有许多PHP函数的JavaScript实现。 包括base64_encode
和base64_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库。