46 lines
1 KiB
JavaScript
46 lines
1 KiB
JavaScript
// base64 decode str -> Uint8Array, to load WA modules
|
|
//
|
|
'use strict';
|
|
|
|
|
|
var BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
|
|
|
|
|
module.exports = function base64decode(str) {
|
|
var input = str.replace(/[\r\n=]/g, ''), // remove CR/LF & padding to simplify scan
|
|
max = input.length;
|
|
|
|
var out = new Uint8Array((max * 3) >> 2);
|
|
|
|
// Collect by 6*4 bits (3 bytes)
|
|
|
|
var bits = 0;
|
|
var ptr = 0;
|
|
|
|
for (var idx = 0; idx < max; idx++) {
|
|
if ((idx % 4 === 0) && idx) {
|
|
out[ptr++] = (bits >> 16) & 0xFF;
|
|
out[ptr++] = (bits >> 8) & 0xFF;
|
|
out[ptr++] = bits & 0xFF;
|
|
}
|
|
|
|
bits = (bits << 6) | BASE64_MAP.indexOf(input.charAt(idx));
|
|
}
|
|
|
|
// Dump tail
|
|
|
|
var tailbits = (max % 4) * 6;
|
|
|
|
if (tailbits === 0) {
|
|
out[ptr++] = (bits >> 16) & 0xFF;
|
|
out[ptr++] = (bits >> 8) & 0xFF;
|
|
out[ptr++] = bits & 0xFF;
|
|
} else if (tailbits === 18) {
|
|
out[ptr++] = (bits >> 10) & 0xFF;
|
|
out[ptr++] = (bits >> 2) & 0xFF;
|
|
} else if (tailbits === 12) {
|
|
out[ptr++] = (bits >> 4) & 0xFF;
|
|
}
|
|
|
|
return out;
|
|
};
|