Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add "To Base62" and "From Base62" operations #443

Merged
merged 1 commit into from
Dec 18, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/core/config/Categories.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
"From Binary",
"To Octal",
"From Octal",
"To Base62",
"From Base62",
"To Base64",
"From Base64",
"Show Base64 offsets",
Expand Down
52 changes: 52 additions & 0 deletions src/core/operations/FromBase62.mjs
Original file line number Diff line number Diff line change
@@ -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 changes: 54 additions & 0 deletions src/core/operations/ToBase62.mjs
Original file line number Diff line number Diff line change
@@ -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 change: 1 addition & 0 deletions test/index.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
79 changes: 79 additions & 0 deletions test/tests/operations/Base62.mjs
Original file line number Diff line number Diff line change
@@ -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: [],
},
],
}
]);