RSS Twitter Facebook

2014/12/29 (2014年12月 のアーカイブ)

Base64/Base64Url エンコーダー/デコーダー

なんかBase64/Base64Urlのエンコーダー、デコーダーを必要になる度に書き直している気がする。探せばいくらでもある事はあるし、毎回書いても大した事ないと言えばないのだけど、それなりに面倒なのでここに割と潰しが効きそうな感じの奴を置いておく事にします。

エンコーダーの方は文字列でもバイト配列でも受け付けて第2引数にtrueを渡すとBase64Urlになります。デコーダーの方は入力は文字列でBase64/Base64Urlのどちらでもデコードでき、第2引数にtrueを渡すと出力が文字列、省力するとバイト配列で戻します。 頑張ればもうちょっと短くなるかも知れないけど、これくらいなら満足かなぁ

WTFPL(Do What The Fuck You Want To Public License) v2 ライセンス : http://www.wtfpl.net
//Licensed under WTFPLv2
function EncBase64(x,base64url){
	var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	var r = "", d = 0, bits = 0, l = x.length, get = function(i){return x[i]};
	if(base64url)
		tab = tab.replace("+/","-_");
	if(typeof(x) == "string")
		get = function(i){return x.charCodeAt(i);};
	for(var i = 0; (i < l) || bits; ++i){
		d <<= 1,++bits;
		if(i < l)
			d = (d << 7) + (get(i) & 0xff), bits += 7;
		while(bits >= 6)
			r += tab[(d >> (bits -= 6)) & 0x3f];
	}
	if(!base64url)
		r += "===".substr(0,((r.length + 3) & ~3) - r.length);
	return r;
}
function DecBase64(x,str){
	x = x.split("=")[0];
	var tab = "-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	var r = [], d = 0, bits = 0, l = x.length;
	for(var i = 0; i < l; ++i){
		d=(d << 6) + ((tab.indexOf(x[i]) - 2) & 0x3f);
		if((bits += 6) >= 8)
			r.push((d >> (bits -= 8)) & 0xff);
	}
	if(str)
		r = String.fromCharCode.apply(null,r);
	return r;
}


※いや、これ、atob()/btoa()が動かない環境がまだあるとばっかり思っていたので作ったのだけど、今の最新のブラウザはどれもatob()/btoa()をサポートしてるんですね orz。ただまあBase64Urlをatob/btoaでやるにはパディングの処理とか文字の置換が必要なのでその辺だけ前後処理が必要になります。後はデコード結果を直接配列で取りたい時とかは使えるかも。まったく無意味という訳でもないので許してください。

Posted by g200kg : 2014/12/29 15:43:27