Kaynağa Gözat

Add "To Base62" and "From Base62" operations

tcode2k16 6 yıl önce
ebeveyn
işleme
22454ae842

+ 2 - 0
src/core/config/Categories.json

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

+ 52 - 0
src/core/operations/FromBase62.mjs

@@ -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;

+ 54 - 0
src/core/operations/ToBase62.mjs

@@ -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;

+ 1 - 0
test/index.mjs

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

+ 79 - 0
test/tests/operations/Base62.mjs

@@ -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: [],
+            },
+        ],
+    }
+]);