radix64-encoding
Version:
Radix64 encoding, a.k.a. Base64 encoding. An extremely fast and synchronous JS implementation.
61 lines (60 loc) • 2.15 kB
JavaScript
/* IMPORT */
import U8 from 'uint8-encoding';
import { ALPHABET_CODES, MASK1, MASK2, MASK3, MASK4 } from './constants.js';
import is from './is.js';
/* MAIN */
const Browser = {
/* API */
encode: (data) => {
const length = Math.ceil(data.length / 3) * 4;
const reminder = (data.length % 3);
const u8 = new Uint8Array(length);
for (let i = 0, j = 0, l = data.length; i < l; i += 3) {
const byte1 = data[i] | 0;
const byte2 = data[i + 1] | 0;
const byte3 = data[i + 2] | 0;
const bytes = (byte1 << 16) | (byte2 << 8) | byte3;
const code1 = (bytes & MASK1) >> 18;
const code2 = (bytes & MASK2) >> 12;
const code3 = (bytes & MASK3) >> 6;
const code4 = (bytes & MASK4);
u8[j++] = ALPHABET_CODES[code1];
u8[j++] = ALPHABET_CODES[code2];
u8[j++] = ALPHABET_CODES[code3];
u8[j++] = ALPHABET_CODES[code4];
}
if (reminder === 1) { // 1 reminder byte, 2 padding characters
u8[length - 1] = u8[length - 2] = 61;
}
else if (reminder === 2) { // 2 reminder bytes, 1 padding character
u8[length - 1] = 61;
}
return U8.decode(u8);
},
encodeStr: (data) => {
if (!/[^\x00-\xFF]/.test(data))
return btoa(data); // Only latin1 characters, calling btoa is safe
return Browser.encode(U8.encode(data));
},
decode: (data) => {
const binary = atob(data);
const u8 = new Uint8Array(binary.length);
for (let i = 0, l = binary.length; i < l; i++) {
u8[i] = binary.charCodeAt(i);
}
return u8;
},
decodeStr: (data) => {
const binary = atob(data);
if (!/[^\x00-\x7F]/.test(binary))
return binary; // Only ascii characters, same as UTF-8 already
const u8 = new Uint8Array(binary.length);
for (let i = 0, l = binary.length; i < l; i++) {
u8[i] = binary.charCodeAt(i);
}
return U8.decode(u8);
},
is
};
/* EXPORT */
export default Browser;