客户端Javascript中的Base64编码和解码
JavaScript中是否有任何方法可用于使用base64编码对字符串进行编码和解码?一些浏览器,如Firefox、Chrome、Safari、Opera和IE10+可以本机处理base64。看看这个。它正在使用 对于服务器端JavaScript(节点),可以使用客户端Javascript中的Base64编码和解码,javascript,base64,Javascript,Base64,JavaScript中是否有任何方法可用于使用base64编码对字符串进行编码和解码?一些浏览器,如Firefox、Chrome、Safari、Opera和IE10+可以本机处理base64。看看这个。它正在使用 对于服务器端JavaScript(节点),可以使用Buffers进行解码 如果您打算采用跨浏览器解决方案,那么现有的库包括: 对于后者,您需要彻底测试该函数的跨浏览器兼容性。和错误。该项目有许多PHP函数的JavaScript实现base64_编码和base64_解码。短而快速的ba
Buffer
s进行解码
如果您打算采用跨浏览器解决方案,那么现有的库包括:
对于后者,您需要彻底测试该函数的跨浏览器兼容性。和错误。该项目有许多PHP函数的JavaScript实现<包括code>base64_编码和
base64_解码
。短而快速的base64 JavaScript解码功能,无故障保护:
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;
}
函数解码\u base64(s)
{
变量e={},i,k,v=[],r='',w=String.fromCharCode;
变量n=[[65,91],[97123],[48,58],[43,44],[47,48];
for(n中的z)
{
对于(i=n[z][0];i>>(l-=8))%256);
}
}
}
返回r;
}
在基于Gecko/WebKit的浏览器(Firefox、Chrome和Safari)和Opera中,您可以使用和
原始答案:我在phpjs.org上尝试了Javascript例程,它们运行得很好 我首先尝试了Ranhiru Cooray在选择的答案中建议的惯例- 我发现它们并非在所有情况下都有效。我编写了一个测试用例,其中这些例程失败,并将它们发布到GitHub:
我还在ntt.cc上的博客帖子上发表了一条评论,提醒作者(等待审核-这篇文章太旧了,所以不确定是否会发表评论)。这里是一个更严格的狙击手帖子版本。它假定格式良好的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;
};
decodeBase64=函数{
变量e={},i,b=0,c,x,l=0,a,r='',w=String.fromCharCode,l=s.length;
var A=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyzo123456789+/”;
对于(i=0;i(l-=8))&0xff)| |(x我宁愿使用最流行的bas64编码/解码方法库,该库用于使用最佳实践和模式在JavaScript中实现的标准和安全加密算法。有人说代码高尔夫吗?=)
以下是我在追赶时代的同时改善我的残疾的尝试。为您提供方便
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;
}
@牙刷建议“像数组一样索引字符串”,并摆脱拆分
。这个程序看起来很奇怪,不确定它的兼容性如何,但它确实击中了另一只小鸟,所以让我们来做吧
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;
}
然而,如果你想找一些更传统的东西,也许下面的内容更符合你的口味
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;
}
注:
结果是一个ascii字节字符串,如果您需要unicode,最简单的方法是转义
字节字符串,然后可以使用decodeURIComponent
对其进行解码以生成unicode字符串
function decode_base64_usc(s) {
return decodeURIComponent(escape(decode_base64(s)));
}
由于escape
被弃用,我们可以将函数更改为直接支持unicode,而不需要escape
或String。从charcode
我们可以生成一个%
转义字符串,以备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);
}));
}
函数解码\u base64(s){
var b=l=0,
m='ABCDEFGHIJKLMNOPQRSTUVWXYZABCDFGHIJKLMNOPQRSTUVXYZ0123456789+/';
返回部件(s.replace)(//g,功能(v){
b=(b(l-=8))&0xff)).toString(16.slice(-2);
}));
}
nJoy!Internet Explorer 10+
跨浏览器
使用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安装角形底座64
有棱角的
.module('myApp',['base64']))
.controller('myController'[
“$base64”、“$scope”,
函数($base64$scope){
$scope.encoded=$base64.encode('a string');
$scope.decoded=$base64.decode('YSBzdHJpbmc=');
}]);
但是怎么做呢?
如果您想进一步了解base64的一般编码方式,特别是JavaScript编码方式,我建议您阅读本文:
功能b64到utf8(str){
返回解码组件(escape(window.atob(str));
}
在Node.js中,我们可以用简单的方式完成
var base64 = 'SGVsbG8gV29ybGQ='
var base64_decode = new Buffer(base64, 'base64').toString('ascii');
console.log(base64_decode); // "Hello World"
对于没有方法的JavaScripts框架,如果您不想导入外部库,这是一个简短的函数
它将获得一个包含Base64编码值的字符串,并将返回一个已解码的字节数组(其中字节数组表示为数字数组,其中每个数字都是0到255(含0到255)之间的整数)
来自base64string(str)的函数{
varα=
“ABCDEFGHIJKLMNOPQRSTUVWXYZABDEFGHIJKLMNOPQRSTUVXYZ0123456789+/”;
var值=[];
var指数=0;
var destIndex=0;
var=false;
while(true){
var first=getNextChr(str、index、padding、alpha);
var second=getNextChr(str,first.nextIndex,first.padding,alpha);
var third=getNextChr(str,second.nextIndex,second.padding,alpha);
var fourth=getNextChr(str,third.nextIndex,third.padding,alpha);
指数=4th.nextIndex;
padding=fourth.padding;
//FFFFFF SS sssstttt ttffffff
var base64_first=first.code==nul
var b = new Buffer('SmF2YVNjcmlwdA==', 'base64')
var s = b.toString();
var str = dojox.encoding.base64.encode(myByteArray);
var bytes = dojox.encoding.base64.decode(str)
<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=');
}]);
var base64 = 'SGVsbG8gV29ybGQ='
var base64_decode = new Buffer(base64, 'base64').toString('ascii');
console.log(base64_decode); // "Hello World"
function base64_encode(s) {
return btoa(unescape(encodeURIComponent(s)));
}
function base64_decode(s) {
return decodeURIComponent(escape(atob(s)));
}
decode_base64=function(f){var g={},b=65,d=0,a,c=0,h,e="",k=String.fromCharCode,l=f.length;for(a="";91>b;)a+=k(b++);a+=a.toLowerCase()+"0123456789+/";for(b=0;64>b;b++)g[a.charAt(b)]=b;for(a=0;a<l;a++)for(b=g[f.charAt(a)],d=(d<<6)+b,c+=6;8<=c;)((h=d>>>(c-=8)&255)||a<l-2)&&(e+=k(h));return e};
sDOS2Win = function(sText, bInsideOut) {
var aCharsets = ["iso-8859-1", "windows-1251"];
sText += "";
bInsideOut = bInsideOut ? 1 : 0;
with (new ActiveXObject("ADODB.Stream")) { //http://www.w3schools.com/ado/ado_ref_stream.asp
type = 2; //Binary 1, Text 2 (default)
mode = 3; //Permissions have not been set 0, Read-only 1, Write-only 2, Read-write 3,
//Prevent other read 4, Prevent other write 8, Prevent other open 12, Allow others all 16
charset = aCharsets[bInsideOut];
open();
writeText(sText);
position = 0;
charset = aCharsets[1 - bInsideOut];
return readText();
}
}
var base64='0PPx8ero5SDh8+ru4uroIQ=='
text = sDOS2Win(decode_base64(base64), false );
WScript.Echo(text)
var x=WScript.StdIn.ReadLine();