Add "To Base62" and "From Base62" operations

This commit is contained in:
tcode2k16 2018-12-17 12:37:00 +08:00
parent 79b9b63982
commit 22454ae842
5 changed files with 188 additions and 0 deletions

View file

@ -18,6 +18,8 @@
"From Binary", "From Binary",
"To Octal", "To Octal",
"From Octal", "From Octal",
"To Base62",
"From Base62",
"To Base64", "To Base64",
"From Base64", "From Base64",
"Show Base64 offsets", "Show Base64 offsets",

View file

@ -0,0 +1,52 @@
/**
* @author tcode2k16 [tcode2k16@gmail.com]
* @copyright Crown Copyright 2018
* @license Apache-2.0
*/
import Operation from "../Operation";
import BigNumber from "bignumber.js";
import Utils from "../Utils";
/**
* From Base62 operation
*/
class FromBase62 extends Operation {
/**
* FromBase62 constructor
*/
constructor() {
super();
this.name = "From Base62";
this.module = "Default";
this.description = "decode base62 string";
this.infoURL = "https://en.wikipedia.org/wiki/List_of_numeral_systems";
this.inputType = "string";
this.outputType = "string";
this.args = [];
}
/**
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run(input, args) {
if (input.length < 1) return "";
const ALPHABET = Utils.expandAlphRange("0-9A-Za-z").join("");
const BN = BigNumber.clone({ ALPHABET });
const re = new RegExp("[^" + ALPHABET.replace(/[[\]\\\-^$]/g, "\\$&") + "]", "g");
input = input.replace(re, "");
const number = new BN(input, 62);
return Utils.byteArrayToUtf8(Utils.convertToByteArray(number.toString(16), "Hex"));
}
}
export default FromBase62;

View file

@ -0,0 +1,54 @@
/**
* @author tcode2k16 [tcode2k16@gmail.com]
* @copyright Crown Copyright 2018
* @license Apache-2.0
*/
import Operation from "../Operation";
import BigNumber from "bignumber.js";
import Utils from "../Utils";
import {toHexFast} from "../lib/Hex";
/**
* To Base62 operation
*/
class ToBase62 extends Operation {
/**
* ToBase62 constructor
*/
constructor() {
super();
this.name = "To Base62";
this.module = "Default";
this.description = "encode string to base62";
this.infoURL = "https://en.wikipedia.org/wiki/List_of_numeral_systems";
this.inputType = "string";
this.outputType = "string";
this.args = [];
}
/**
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run(input, args) {
if (input.length < 1) return "";
const ALPHABET = Utils.expandAlphRange("0-9A-Za-z").join("");
const BN = BigNumber.clone({ ALPHABET });
input = Utils.strToByteArray(input);
input = toHexFast(input);
input = input.toUpperCase();
const number = new BN(input, 16);
return number.toString(62);
}
}
export default ToBase62;

View file

@ -28,6 +28,7 @@ import "./tests/operations/BCD";
import "./tests/operations/BSON"; import "./tests/operations/BSON";
import "./tests/operations/Base58"; import "./tests/operations/Base58";
import "./tests/operations/Base64"; import "./tests/operations/Base64";
import "./tests/operations/Base62";
import "./tests/operations/BitwiseOp"; import "./tests/operations/BitwiseOp";
import "./tests/operations/ByteRepr"; import "./tests/operations/ByteRepr";
import "./tests/operations/CartesianProduct"; import "./tests/operations/CartesianProduct";

View file

@ -0,0 +1,79 @@
/**
* Base62 tests.
*
* @author tcode2k16 [tcode2k16@gmail.com]
*
* @copyright Crown Copyright 2018
* @license Apache-2.0
*/
import TestRegister from "../../TestRegister";
TestRegister.addTests([
{
name: "To Base62: nothing",
input: "",
expectedOutput: "",
recipeConfig: [
{
op: "To Base62",
args: [],
},
],
},
{
name: "To Base62: Hello, World!",
input: "Hello, World!",
expectedOutput: "1wJfrzvdbtXUOlUjUf",
recipeConfig: [
{
op: "To Base62",
args: [],
},
],
},
{
name: "To Base62: UTF-8",
input: "ნუ პანიკას",
expectedOutput: "BPDNbjoGvDCDzHbKT77eWg0vGQrJuWRXltuRVZ",
recipeConfig: [
{
op: "To Base62",
args: [],
},
],
},
{
name: "From Base62: nothing",
input: "",
expectedOutput: "",
recipeConfig: [
{
op: "From Base62",
args: [],
},
],
},
{
name: "From Base62: Hello, World!",
input: "1wJfrzvdbtXUOlUjUf",
expectedOutput: "Hello, World!",
recipeConfig: [
{
op: "From Base62",
args: [],
},
],
},
{
name: "From Base62: UTF-8",
input: "BPDNbjoGvDCDzHbKT77eWg0vGQrJuWRXltuRVZ",
expectedOutput: "ნუ პანიკას",
recipeConfig: [
{
op: "From Base62",
args: [],
},
],
}
]);