47 lines
1.4 KiB
TypeScript
47 lines
1.4 KiB
TypeScript
const BASE64_DEC: {[key: string]: number} = {};
|
|
[... 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'].forEach(
|
|
(c, i) => BASE64_DEC[c] = i);
|
|
BASE64_DEC['+'] = BASE64_DEC['-'] = 62;
|
|
BASE64_DEC['/'] = BASE64_DEC['_'] = 63;
|
|
|
|
export function decodeBase64(s: string): Uint8Array {
|
|
const bs = new Uint8Array(Math.floor(s.length * 3/4));
|
|
let i = 0;
|
|
let j = 0;
|
|
while (i < s.length) {
|
|
const v1 = BASE64_DEC[s[i++]];
|
|
const v2 = BASE64_DEC[s[i++]];
|
|
const v3 = BASE64_DEC[s[i++]];
|
|
const v4 = BASE64_DEC[s[i++]];
|
|
const v = (v1 << 18) | (v2 << 12) | (v3 << 6) | v4;
|
|
bs[j++] = (v >> 16) & 255;
|
|
if (v3 === void 0) break;
|
|
bs[j++] = (v >> 8) & 255;
|
|
if (v4 === void 0) break;
|
|
bs[j++] = v & 255;
|
|
}
|
|
return bs.subarray(0, j);
|
|
}
|
|
|
|
const BASE64_ENC = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
|
|
|
export function encodeBase64(bs: Uint8Array): string {
|
|
let s = '';
|
|
let buffer = 0;
|
|
let bitcount = 0;
|
|
for (let b of bs) {
|
|
buffer = ((buffer & 0x3f) << 8) | b;
|
|
bitcount += 8;
|
|
while (bitcount >= 6) {
|
|
bitcount -= 6;
|
|
const v = (buffer >> bitcount) & 0x3f;
|
|
s = s + BASE64_ENC[v];
|
|
}
|
|
}
|
|
if (bitcount > 0) {
|
|
const v = (buffer << (6 - bitcount)) & 0x3f;
|
|
s = s + BASE64_ENC[v];
|
|
}
|
|
return s;
|
|
}
|