var ab = new ArrayBuffer(70*1024);
var uint8 = new Uint8Array(ab);
for (var i = 0; i < ab.byteLength; i++) {
uint8[i] = i % 256;
}
var expected = window.btoa(String.fromCharCode.apply(null, uint8));
function byteArrayToString(bytes) {
var CHUNK_SIZE = 8*1024;
if (bytes.length <= CHUNK_SIZE)
return String.fromCharCode.apply(null, bytes);
var str = '';
for (var i = 0; i < bytes.length; i += CHUNK_SIZE)
str += String.fromCharCode.apply(null, bytes.slice(i, i+CHUNK_SIZE));
return str;
}
function validate(res){
if (res !== expected)
throw "expected=" + expected + " but got " + res;
}
function uint6ToB64(nUint6) {
return nUint6 < 26 ?
nUint6 + 65
: nUint6 < 52 ?
nUint6 + 71
: nUint6 < 62 ?
nUint6 - 4
: nUint6 === 62 ?
43
: nUint6 === 63 ?
47
:
65;
};
function bytesToBase64(aBytes) {
var eqLen = (3 - (aBytes.length % 3)) % 3, sB64Enc = "";
for (var nMod3, nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {
nMod3 = nIdx % 3;
nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24);
if (nMod3 === 2 || aBytes.length - nIdx === 1) {
sB64Enc += String.fromCharCode(uint6ToB64(nUint24 >>> 18 & 63), uint6ToB64(nUint24 >>> 12 & 63), uint6ToB64(nUint24 >>> 6 & 63), uint6ToB64(nUint24 & 63));
nUint24 = 0;
}
}
return eqLen === 0 ?
sB64Enc
:
sB64Enc.substring(0, sB64Enc.length - eqLen) + (eqLen === 1 ? "=" : "==");
};