Skip to content

Instantly share code, notes, and snippets.

@tatat
Created September 25, 2012 07:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tatat/3780448 to your computer and use it in GitHub Desktop.
Save tatat/3780448 to your computer and use it in GitHub Desktop.
Base64 to DataView
var base64_decode_dataview = (function() {
var __map = {}
, __map_18 = {}
, __map_12 = {}
, __map_6 = {};
!function() {
var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for (var i = 0, j = chars.length, c; i < j; i ++) {
c = chars.charAt(i);
__map[c] = i;
__map_18[c] = i << 18;
__map_12[c] = i << 12;
__map_6[c] = i << 6;
}
}();
return function(_a, callback) {
if (_a.indexOf('\n') !== -1)
_a = _a.replace(/\n/g, '');
var execute = function() {
var a = _a
, map_18 = __map_18
, map_12 = __map_12
, map_6 = __map_6
, map = __map
, length = a.length
, padindex = a.indexOf('=')
, padlen = padindex > -1 ? length - padindex : 0
, result = new DataView(new ArrayBuffer(length * 3 / 4 - padlen))
, offset = 0
, last = length - 4 - (length % 4);
for (var i = 0, padding_length, len, n; i < length; i += 4) {
if (i === last) {
len = 4 - (padlen || (i + 4) - length);
padding_length = len % 4;
n = (len > 0 ? map_18[a[i + 0]] : 0) |
(len > 1 ? map_12[a[i + 1]] : 0) |
(len > 2 ? map_6[a[i + 2]] : 0) |
(len > 3 ? map[a[i + 3]] : 0);
} else {
padding_length = 0;
n = map_18[a[i + 0]] | map_12[a[i + 1]] | map_6[a[i + 2]] | map[a[i + 3]];
}
switch (padding_length) {
case 0:
case 1:
result.setUint8(offset ++, n >>> 16);
result.setUint8(offset ++, (n >>> 8) & 0xff);
result.setUint8(offset ++, n & 0xff);
break;
case 2:
result.setUint8(offset ++, n >>> 16);
break;
case 3:
result.setUint8(offset ++, n >>> 16);
result.setUint8(offset ++, (n >>> 8) & 0xff);
break;
}
}
return result;
};
if (callback) {
setTimeout(function() {
callback(execute());
}, 0);
} else {
return execute();
}
};
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment