b64decode:: String -> Uint8Array

canvas.toDataURLとかから使いたいなと。引数の文字列をいじらないのとループの中で条件分岐しないので多少速くなった気がする。まぁ、毎回Array.prototype.forEachを呼んでいるところに手抜き感が見えるけど用途的に無視できるくらいのもんでしょ。

function b64decode(str) {
var hash = {'=': 0},
i = 0,
j = 0,
n = str.length,
bytes = new Uint8Array(n * 6 / 8),
a1, a2, a3, a4;

Array.prototype.forEach.call(
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
function(c, i){hash[c] = i});

for(;i < n; i += 4, j += 3) {
a1 = hash[str[i]];
a2 = hash[str[i + 1]];
a3 = hash[str[i + 2]];
a4 = hash[str[i + 3]];

bytes[j] = (a1 << 2) | (a2 >> 4);
bytes[j + 1] = (a2 << 4) | (a3 >> 2);
bytes[j + 2] = (a3 << 6) | a4;
}

return bytes.subarray(0, j - (str[n - 1] === '=' ? 1 : 0) - (str[n - 2] === '=' ? 1 : 0));
}

ご利用はご自由に。ただし、動作保証はしません(動画をcanvasでキャプチャしながらBlobに変換してimg.srcにセットするのが一番手っ取り早いかな)。

追記:
encode(Uint8Array -> String)も足しました。FileReader#readAsDataURLを使えばよいので楽ですね。どちらかというとWorker内で使ったほうが楽です(コールバックが要らないので)。




posted by 右京 | javascript
blog comments powered by Disqus
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。