投稿者 tel | 2012年2月12日

base64を配列にデコードする

やっぱりデコードの部分もほしかったのでコード書いた。

var Base64 = function() {

var _e = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
	_d = {};

for(var i = 0, l = _e.length; i < l; i++) {
	_d[_e[i]] = i;
}

return {
	encode: function(a, s) {
		var l = s === undefined ? a.length : s,
			m = l % 3,
			r = [];

		for(var i = 0; i <= l - 3; i += 3) {
			var j = (a[i] << 16) | (a[i + 1] << 8) | a[i + 2];
			r.push(_e[j >> 18 & 63], _e[j >> 12 & 63], _e[j >> 6 & 63], _e[j & 63]);
		}

		if(m == 1) {
			j = a[i] << 16;
			r.push(_e[j >> 18 & 63], _e[j >> 12 & 63], '==');
		} else if(m == 2) {
			j = (a[i] << 16) | (a[i + 1] << 8);
			r.push(_e[j >> 18 & 63], _e[j >> 12 & 63], _e[j >> 6 & 63], '=');
		}

		return r.join('');
	},
	decode: function(b, a) {
		if(a === undefined) {
			a = [];
		}

		var l = b.length;

		b[l - 1] === '=' && l--;
		b[l - 1] === '=' && l--;
		b[l - 1] === '=' && l--;

		var m = b.length - l;

		for(var i = 0, j = 0; i <= l - 4; i += 4) {
			var k = (_d[b[i]] << 18) | (_d[b[i + 1]] << 12) | (_d[b[i + 2]] << 6) | _d[b[i + 3]];
			a[j++] = k >> 16 & 255;
			a[j++] = k >> 8 & 255;
			a[j++] = k & 255;
		}

		if(m == 1) {
			k = (_d[b[i]] << 18) | (_d[b[i + 1]] << 12) | (_d[b[i + 2]] << 6);
			a[j++] = k >> 16 & 255;
			a[j] = k >> 8 & 255;
		} else if(m == 2) {
			k = (_d[b[i]] << 18) | (_d[b[i + 1]] << 12);
			a[j] = k >> 16 & 255;
		}

		return a;
	},
	decodeSize: function(b) {
		var l = b.length;
		if(l >= 4) {
			var s = l / 4 * 3;
			b[l - 1] === '=' && s--;
			b[l - 2] === '=' && s--;
			b[l - 3] === '=' && s--;
			return s;
		}
		return 0;
	}
};

}();

var text = Base64.encode([1,2,3,4]); // "AQIDBA=="
Base64.decode("AQIDBA=="); // [1, 2, 3, 4]

配列の型を外で指定して使いたかったので引数で渡すようにした。たぶんTyped Array(ArrayBuffer類)とかCanvas Pixel Arrayもいけるはず。ただし値が1バイトより大きい場合はダメ。


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー

%d人のブロガーが「いいね」をつけました。