123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- var api = {};
- module.exports = api;
- var _reverseAlphabets = {};
- api.encode = function(input, alphabet, maxline) {
- if(typeof alphabet !== 'string') {
- throw new TypeError('"alphabet" must be a string.');
- }
- if(maxline !== undefined && typeof maxline !== 'number') {
- throw new TypeError('"maxline" must be a number.');
- }
- var output = '';
- if(!(input instanceof Uint8Array)) {
-
- output = _encodeWithByteBuffer(input, alphabet);
- } else {
- var i = 0;
- var base = alphabet.length;
- var first = alphabet.charAt(0);
- var digits = [0];
- for(i = 0; i < input.length; ++i) {
- for(var j = 0, carry = input[i]; j < digits.length; ++j) {
- carry += digits[j] << 8;
- digits[j] = carry % base;
- carry = (carry / base) | 0;
- }
- while(carry > 0) {
- digits.push(carry % base);
- carry = (carry / base) | 0;
- }
- }
-
- for(i = 0; input[i] === 0 && i < input.length - 1; ++i) {
- output += first;
- }
-
- for(i = digits.length - 1; i >= 0; --i) {
- output += alphabet[digits[i]];
- }
- }
- if(maxline) {
- var regex = new RegExp('.{1,' + maxline + '}', 'g');
- output = output.match(regex).join('\r\n');
- }
- return output;
- };
- api.decode = function(input, alphabet) {
- if(typeof input !== 'string') {
- throw new TypeError('"input" must be a string.');
- }
- if(typeof alphabet !== 'string') {
- throw new TypeError('"alphabet" must be a string.');
- }
- var table = _reverseAlphabets[alphabet];
- if(!table) {
-
- table = _reverseAlphabets[alphabet] = [];
- for(var i = 0; i < alphabet.length; ++i) {
- table[alphabet.charCodeAt(i)] = i;
- }
- }
-
- input = input.replace(/\s/g, '');
- var base = alphabet.length;
- var first = alphabet.charAt(0);
- var bytes = [0];
- for(var i = 0; i < input.length; i++) {
- var value = table[input.charCodeAt(i)];
- if(value === undefined) {
- return;
- }
- for(var j = 0, carry = value; j < bytes.length; ++j) {
- carry += bytes[j] * base;
- bytes[j] = carry & 0xff;
- carry >>= 8;
- }
- while(carry > 0) {
- bytes.push(carry & 0xff);
- carry >>= 8;
- }
- }
-
- for(var k = 0; input[k] === first && k < input.length - 1; ++k) {
- bytes.push(0);
- }
- if(typeof Buffer !== 'undefined') {
- return Buffer.from(bytes.reverse());
- }
- return new Uint8Array(bytes.reverse());
- };
- function _encodeWithByteBuffer(input, alphabet) {
- var i = 0;
- var base = alphabet.length;
- var first = alphabet.charAt(0);
- var digits = [0];
- for(i = 0; i < input.length(); ++i) {
- for(var j = 0, carry = input.at(i); j < digits.length; ++j) {
- carry += digits[j] << 8;
- digits[j] = carry % base;
- carry = (carry / base) | 0;
- }
- while(carry > 0) {
- digits.push(carry % base);
- carry = (carry / base) | 0;
- }
- }
- var output = '';
-
- for(i = 0; input.at(i) === 0 && i < input.length() - 1; ++i) {
- output += first;
- }
-
- for(i = digits.length - 1; i >= 0; --i) {
- output += alphabet[digits[i]];
- }
- return output;
- }
|