UNPKG

basex-encoder

Version:

Encode / decode any base X to and from string or buffer

89 lines 3.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.encoder = function (ALPHABET, defaultEncoding) { if (defaultEncoding === void 0) { defaultEncoding = 'utf8'; } var ALPHABET_MAP = {}; var BASE = ALPHABET.length; var LEADER = ALPHABET.charAt(0); for (var z = 0; z < ALPHABET.length; z += 1) { var x = ALPHABET.charAt(z); if (ALPHABET_MAP[x] !== undefined) { throw new TypeError("'" + x + "' is duplicate!"); } ALPHABET_MAP[x] = z; } var encodeFromBuffer = function (source) { var sourceLen = source.length; if (sourceLen === 0) { return ''; } var digits = [0]; for (var i = 0; i < sourceLen; i += 1) { var carry = source[i]; var digitsLen = digits.length; for (var j = 0; j < digitsLen; j += 1) { carry += digits[j] << 8; digits[j] = carry % BASE; carry = (carry / BASE) | 0; } while (carry > 0) { digits.push(carry % BASE); carry = (carry / BASE) | 0; } } var str = ''; var lastSourceIndex = sourceLen - 1; for (var k = 0; source[k] === 0 && k < lastSourceIndex; k += 1) { str += LEADER; } for (var q = digits.length - 1; q >= 0; q -= 1) { str += ALPHABET[digits[q]]; } return str; }; var decodeToBuffer = function (encoded) { if (encoded.length === 0) { return Buffer.allocUnsafe(0); } var bytes = [0]; var strLen = encoded.length; for (var i = 0; i < strLen; i += 1) { var value = ALPHABET_MAP[encoded[i]]; if (value === undefined) { return null; } var carry = value; var bytesLen = bytes.length; for (var j = 0; j < bytesLen; j += 1) { carry += bytes[j] * BASE; bytes[j] = carry & 0xff; carry >>= 8; } while (carry > 0) { bytes.push(carry & 0xff); carry >>= 8; } } var lastStrIndex = encoded.length - 1; for (var k = 0; encoded[k] === LEADER && k < lastStrIndex; k += 1) { bytes.push(0); } return Buffer.from(bytes.reverse()); }; var encode = function (str, encoding) { if (encoding === void 0) { encoding = defaultEncoding; } return encodeFromBuffer(Buffer.from(str, encoding)); }; var decode = function (encoded, encoding) { if (encoding === void 0) { encoding = defaultEncoding; } var buffer = decodeToBuffer(encoded); return buffer && buffer.toString(encoding); }; return { encode: encode, decode: decode, encodeFromBuffer: encodeFromBuffer, decodeToBuffer: decodeToBuffer, }; }; //# sourceMappingURL=index.js.map