ESM: Added Hex ops and created a Hex library.
This commit is contained in:
parent
0011e9caa8
commit
eeb1d0a891
@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import Utils from "./Utils";
|
import Utils from "./Utils";
|
||||||
|
import {fromHex} from "./lib/Hex";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The arguments to operations.
|
* The arguments to operations.
|
||||||
@ -88,7 +89,7 @@ class Ingredient {
|
|||||||
case "byteArray":
|
case "byteArray":
|
||||||
if (typeof data == "string") {
|
if (typeof data == "string") {
|
||||||
data = data.replace(/\s+/g, "");
|
data = data.replace(/\s+/g, "");
|
||||||
return Utils.fromHex(data);
|
return fromHex(data);
|
||||||
} else {
|
} else {
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
import utf8 from "utf8";
|
import utf8 from "utf8";
|
||||||
import moment from "moment-timezone";
|
import moment from "moment-timezone";
|
||||||
import {fromBase64} from "./lib/Base64";
|
import {fromBase64} from "./lib/Base64";
|
||||||
|
import {toHexFast, fromHex} from "./lib/Hex";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -312,7 +313,7 @@ class Utils {
|
|||||||
static convertToByteArray(str, type) {
|
static convertToByteArray(str, type) {
|
||||||
switch (type.toLowerCase()) {
|
switch (type.toLowerCase()) {
|
||||||
case "hex":
|
case "hex":
|
||||||
return Utils.fromHex(str);
|
return fromHex(str);
|
||||||
case "base64":
|
case "base64":
|
||||||
return fromBase64(str, null, "byteArray");
|
return fromBase64(str, null, "byteArray");
|
||||||
case "utf8":
|
case "utf8":
|
||||||
@ -345,7 +346,7 @@ class Utils {
|
|||||||
static convertToByteString(str, type) {
|
static convertToByteString(str, type) {
|
||||||
switch (type.toLowerCase()) {
|
switch (type.toLowerCase()) {
|
||||||
case "hex":
|
case "hex":
|
||||||
return Utils.byteArrayToChars(Utils.fromHex(str));
|
return Utils.byteArrayToChars(fromHex(str));
|
||||||
case "base64":
|
case "base64":
|
||||||
return Utils.byteArrayToChars(fromBase64(str, null, "byteArray"));
|
return Utils.byteArrayToChars(fromBase64(str, null, "byteArray"));
|
||||||
case "utf8":
|
case "utf8":
|
||||||
@ -519,95 +520,6 @@ class Utils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a byte array into a hex string.
|
|
||||||
*
|
|
||||||
* @param {Uint8Array|byteArray} data
|
|
||||||
* @param {string} [delim=" "]
|
|
||||||
* @param {number} [padding=2]
|
|
||||||
* @returns {string}
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* // returns "0a 14 1e"
|
|
||||||
* Utils.toHex([10,20,30]);
|
|
||||||
*
|
|
||||||
* // returns "0a:14:1e"
|
|
||||||
* Utils.toHex([10,20,30], ":");
|
|
||||||
*/
|
|
||||||
static toHex(data, delim=" ", padding=2) {
|
|
||||||
if (!data) return "";
|
|
||||||
|
|
||||||
let output = "";
|
|
||||||
|
|
||||||
for (let i = 0; i < data.length; i++) {
|
|
||||||
output += data[i].toString(16).padStart(padding, "0") + delim;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add \x or 0x to beginning
|
|
||||||
if (delim === "0x") output = "0x" + output;
|
|
||||||
if (delim === "\\x") output = "\\x" + output;
|
|
||||||
|
|
||||||
if (delim.length)
|
|
||||||
return output.slice(0, -delim.length);
|
|
||||||
else
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a byte array into a hex string as efficiently as possible with no options.
|
|
||||||
*
|
|
||||||
* @param {byteArray} data
|
|
||||||
* @returns {string}
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* // returns "0a141e"
|
|
||||||
* Utils.toHex([10,20,30]);
|
|
||||||
*/
|
|
||||||
static toHexFast(data) {
|
|
||||||
if (!data) return "";
|
|
||||||
|
|
||||||
const output = [];
|
|
||||||
|
|
||||||
for (let i = 0; i < data.length; i++) {
|
|
||||||
output.push((data[i] >>> 4).toString(16));
|
|
||||||
output.push((data[i] & 0x0f).toString(16));
|
|
||||||
}
|
|
||||||
|
|
||||||
return output.join("");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a hex string into a byte array.
|
|
||||||
*
|
|
||||||
* @param {string} data
|
|
||||||
* @param {string} [delim]
|
|
||||||
* @param {number} [byteLen=2]
|
|
||||||
* @returns {byteArray}
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* // returns [10,20,30]
|
|
||||||
* Utils.fromHex("0a 14 1e");
|
|
||||||
*
|
|
||||||
* // returns [10,20,30]
|
|
||||||
* Utils.fromHex("0a:14:1e", "Colon");
|
|
||||||
*/
|
|
||||||
static fromHex(data, delim, byteLen=2) {
|
|
||||||
delim = delim || (data.indexOf(" ") >= 0 ? "Space" : "None");
|
|
||||||
if (delim !== "None") {
|
|
||||||
const delimRegex = Utils.regexRep(delim);
|
|
||||||
data = data.replace(delimRegex, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
const output = [];
|
|
||||||
for (let i = 0; i < data.length; i += byteLen) {
|
|
||||||
output.push(parseInt(data.substr(i, byteLen), 16));
|
|
||||||
}
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses CSV data and returns it as a two dimensional array or strings.
|
* Parses CSV data and returns it as a two dimensional array or strings.
|
||||||
*
|
*
|
||||||
@ -944,7 +856,7 @@ class Utils {
|
|||||||
title='Download ${Utils.escapeHtml(file.fileName)}'
|
title='Download ${Utils.escapeHtml(file.fileName)}'
|
||||||
download='${Utils.escapeHtml(file.fileName)}'>💾</a>`;
|
download='${Utils.escapeHtml(file.fileName)}'>💾</a>`;
|
||||||
|
|
||||||
const hexFileData = Utils.toHexFast(new Uint8Array(file.bytes));
|
const hexFileData = toHexFast(new Uint8Array(file.bytes));
|
||||||
|
|
||||||
const switchToInputElem = `<a href='#switchFileToInput${i}'
|
const switchToInputElem = `<a href='#switchFileToInput${i}'
|
||||||
class='file-switch'
|
class='file-switch'
|
||||||
|
@ -27,8 +27,8 @@ const Categories = [
|
|||||||
ops: [
|
ops: [
|
||||||
// "To Hexdump",
|
// "To Hexdump",
|
||||||
// "From Hexdump",
|
// "From Hexdump",
|
||||||
// "To Hex",
|
"To Hex",
|
||||||
// "From Hex",
|
"From Hex",
|
||||||
// "To Charcode",
|
// "To Charcode",
|
||||||
// "From Charcode",
|
// "From Charcode",
|
||||||
// "To Decimal",
|
// "To Decimal",
|
||||||
|
@ -90,6 +90,30 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"From Hex": {
|
||||||
|
"module": "Default",
|
||||||
|
"description": "Converts a hexadecimal byte string back into its raw value.<br><br>e.g. <code>ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a</code> becomes the UTF-8 encoded string <code>Γειά σου</code>",
|
||||||
|
"inputType": "string",
|
||||||
|
"outputType": "byteArray",
|
||||||
|
"flowControl": false,
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "Delimiter",
|
||||||
|
"type": "option",
|
||||||
|
"value": [
|
||||||
|
"Space",
|
||||||
|
"Comma",
|
||||||
|
"Semi-colon",
|
||||||
|
"Colon",
|
||||||
|
"Line feed",
|
||||||
|
"CRLF",
|
||||||
|
"0x",
|
||||||
|
"\\x",
|
||||||
|
"None"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
"Show Base64 offsets": {
|
"Show Base64 offsets": {
|
||||||
"module": "Default",
|
"module": "Default",
|
||||||
"description": "When a string is within a block of data and the whole block is Base64'd, the string itself could be represented in Base64 in three distinct ways depending on its offset within the block.<br><br>This operation shows all possible offsets for a given string so that each possible encoding can be considered.",
|
"description": "When a string is within a block of data and the whole block is Base64'd, the string itself could be represented in Base64 in three distinct ways depending on its offset within the block.<br><br>This operation shows all possible offsets for a given string so that each possible encoding can be considered.",
|
||||||
@ -189,5 +213,29 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"To Hex": {
|
||||||
|
"module": "Default",
|
||||||
|
"description": "Converts the input string to hexadecimal bytes separated by the specified delimiter.<br><br>e.g. The UTF-8 encoded string <code>Γειά σου</code> becomes <code>ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a</code>",
|
||||||
|
"inputType": "ArrayBuffer",
|
||||||
|
"outputType": "string",
|
||||||
|
"flowControl": false,
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "Delimiter",
|
||||||
|
"type": "option",
|
||||||
|
"value": [
|
||||||
|
"Space",
|
||||||
|
"Comma",
|
||||||
|
"Semi-colon",
|
||||||
|
"Colon",
|
||||||
|
"Line feed",
|
||||||
|
"CRLF",
|
||||||
|
"0x",
|
||||||
|
"\\x",
|
||||||
|
"None"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -7,18 +7,22 @@
|
|||||||
*/
|
*/
|
||||||
import FromBase32 from "../../operations/FromBase32";
|
import FromBase32 from "../../operations/FromBase32";
|
||||||
import FromBase64 from "../../operations/FromBase64";
|
import FromBase64 from "../../operations/FromBase64";
|
||||||
|
import FromHex from "../../operations/FromHex";
|
||||||
import ShowBase64Offsets from "../../operations/ShowBase64Offsets";
|
import ShowBase64Offsets from "../../operations/ShowBase64Offsets";
|
||||||
import ToBase32 from "../../operations/ToBase32";
|
import ToBase32 from "../../operations/ToBase32";
|
||||||
import ToBase64 from "../../operations/ToBase64";
|
import ToBase64 from "../../operations/ToBase64";
|
||||||
|
import ToHex from "../../operations/ToHex";
|
||||||
|
|
||||||
const OpModules = typeof self === "undefined" ? {} : self.OpModules || {};
|
const OpModules = typeof self === "undefined" ? {} : self.OpModules || {};
|
||||||
|
|
||||||
OpModules.Default = {
|
OpModules.Default = {
|
||||||
"From Base32": FromBase32,
|
"From Base32": FromBase32,
|
||||||
"From Base64": FromBase64,
|
"From Base64": FromBase64,
|
||||||
|
"From Hex": FromHex,
|
||||||
"Show Base64 offsets": ShowBase64Offsets,
|
"Show Base64 offsets": ShowBase64Offsets,
|
||||||
"To Base32": ToBase32,
|
"To Base32": ToBase32,
|
||||||
"To Base64": ToBase64,
|
"To Base64": ToBase64,
|
||||||
|
"To Hex": ToHex,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default OpModules;
|
export default OpModules;
|
||||||
|
104
src/core/lib/Hex.mjs
Normal file
104
src/core/lib/Hex.mjs
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/**
|
||||||
|
* Byte representation functions.
|
||||||
|
*
|
||||||
|
* @author n1474335 [n1474335@gmail.com]
|
||||||
|
* @copyright Crown Copyright 2016
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Utils from "../Utils";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a byte array into a hex string.
|
||||||
|
*
|
||||||
|
* @param {Uint8Array|byteArray} data
|
||||||
|
* @param {string} [delim=" "]
|
||||||
|
* @param {number} [padding=2]
|
||||||
|
* @returns {string}
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // returns "0a 14 1e"
|
||||||
|
* toHex([10,20,30]);
|
||||||
|
*
|
||||||
|
* // returns "0a:14:1e"
|
||||||
|
* toHex([10,20,30], ":");
|
||||||
|
*/
|
||||||
|
export function toHex(data, delim=" ", padding=2) {
|
||||||
|
if (!data) return "";
|
||||||
|
|
||||||
|
let output = "";
|
||||||
|
|
||||||
|
for (let i = 0; i < data.length; i++) {
|
||||||
|
output += data[i].toString(16).padStart(padding, "0") + delim;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add \x or 0x to beginning
|
||||||
|
if (delim === "0x") output = "0x" + output;
|
||||||
|
if (delim === "\\x") output = "\\x" + output;
|
||||||
|
|
||||||
|
if (delim.length)
|
||||||
|
return output.slice(0, -delim.length);
|
||||||
|
else
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a byte array into a hex string as efficiently as possible with no options.
|
||||||
|
*
|
||||||
|
* @param {byteArray} data
|
||||||
|
* @returns {string}
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // returns "0a141e"
|
||||||
|
* toHex([10,20,30]);
|
||||||
|
*/
|
||||||
|
export function toHexFast(data) {
|
||||||
|
if (!data) return "";
|
||||||
|
|
||||||
|
const output = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < data.length; i++) {
|
||||||
|
output.push((data[i] >>> 4).toString(16));
|
||||||
|
output.push((data[i] & 0x0f).toString(16));
|
||||||
|
}
|
||||||
|
|
||||||
|
return output.join("");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a hex string into a byte array.
|
||||||
|
*
|
||||||
|
* @param {string} data
|
||||||
|
* @param {string} [delim]
|
||||||
|
* @param {number} [byteLen=2]
|
||||||
|
* @returns {byteArray}
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // returns [10,20,30]
|
||||||
|
* fromHex("0a 14 1e");
|
||||||
|
*
|
||||||
|
* // returns [10,20,30]
|
||||||
|
* fromHex("0a:14:1e", "Colon");
|
||||||
|
*/
|
||||||
|
export function fromHex(data, delim, byteLen=2) {
|
||||||
|
delim = delim || (data.indexOf(" ") >= 0 ? "Space" : "None");
|
||||||
|
if (delim !== "None") {
|
||||||
|
const delimRegex = Utils.regexRep(delim);
|
||||||
|
data = data.replace(delimRegex, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
const output = [];
|
||||||
|
for (let i = 0; i < data.length; i += byteLen) {
|
||||||
|
output.push(parseInt(data.substr(i, byteLen), 16));
|
||||||
|
}
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hexadecimal delimiters.
|
||||||
|
*/
|
||||||
|
export const HEX_DELIM_OPTIONS = ["Space", "Comma", "Semi-colon", "Colon", "Line feed", "CRLF", "0x", "\\x", "None"];
|
98
src/core/operations/FromHex.mjs
Normal file
98
src/core/operations/FromHex.mjs
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
/**
|
||||||
|
* @author n1474335 [n1474335@gmail.com]
|
||||||
|
* @copyright Crown Copyright 2016
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Operation from "../Operation";
|
||||||
|
import {fromHex, HEX_DELIM_OPTIONS} from "../lib/Hex";
|
||||||
|
import Utils from "../Utils";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* From Hex operation
|
||||||
|
*/
|
||||||
|
class FromHex extends Operation {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FromHex constructor
|
||||||
|
*/
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.name = "From Hex";
|
||||||
|
this.module = "Default";
|
||||||
|
this.description = "Converts a hexadecimal byte string back into its raw value.<br><br>e.g. <code>ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a</code> becomes the UTF-8 encoded string <code>Γειά σου</code>";
|
||||||
|
this.inputType = "string";
|
||||||
|
this.outputType = "byteArray";
|
||||||
|
this.args = [
|
||||||
|
{
|
||||||
|
name: "Delimiter",
|
||||||
|
type: "option",
|
||||||
|
value: HEX_DELIM_OPTIONS
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} input
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {byteArray}
|
||||||
|
*/
|
||||||
|
run(input, args) {
|
||||||
|
const delim = args[0] || "Space";
|
||||||
|
return fromHex(input, delim, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Highlight to Hex
|
||||||
|
*
|
||||||
|
* @param {Object[]} pos
|
||||||
|
* @param {number} pos[].start
|
||||||
|
* @param {number} pos[].end
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {Object[]} pos
|
||||||
|
*/
|
||||||
|
highlight(pos, args) {
|
||||||
|
const delim = Utils.charRep(args[0] || "Space"),
|
||||||
|
len = delim === "\r\n" ? 1 : delim.length,
|
||||||
|
width = len + 2;
|
||||||
|
|
||||||
|
// 0x and \x are added to the beginning if they are selected, so increment the positions accordingly
|
||||||
|
if (delim === "0x" || delim === "\\x") {
|
||||||
|
if (pos[0].start > 1) pos[0].start -= 2;
|
||||||
|
else pos[0].start = 0;
|
||||||
|
if (pos[0].end > 1) pos[0].end -= 2;
|
||||||
|
else pos[0].end = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos[0].start = pos[0].start === 0 ? 0 : Math.round(pos[0].start / width);
|
||||||
|
pos[0].end = pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / width);
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Highlight from Hex
|
||||||
|
*
|
||||||
|
* @param {Object[]} pos
|
||||||
|
* @param {number} pos[].start
|
||||||
|
* @param {number} pos[].end
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {Object[]} pos
|
||||||
|
*/
|
||||||
|
highlightReverse(pos, args) {
|
||||||
|
const delim = Utils.charRep(args[0] || "Space"),
|
||||||
|
len = delim === "\r\n" ? 1 : delim.length;
|
||||||
|
|
||||||
|
pos[0].start = pos[0].start * (2 + len);
|
||||||
|
pos[0].end = pos[0].end * (2 + len) - len;
|
||||||
|
|
||||||
|
// 0x and \x are added to the beginning if they are selected, so increment the positions accordingly
|
||||||
|
if (delim === "0x" || delim === "\\x") {
|
||||||
|
pos[0].start += 2;
|
||||||
|
pos[0].end += 2;
|
||||||
|
}
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default FromHex;
|
98
src/core/operations/ToHex.mjs
Normal file
98
src/core/operations/ToHex.mjs
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
/**
|
||||||
|
* @author n1474335 [n1474335@gmail.com]
|
||||||
|
* @copyright Crown Copyright 2016
|
||||||
|
* @license Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Operation from "../Operation";
|
||||||
|
import {toHex, HEX_DELIM_OPTIONS} from "../lib/Hex";
|
||||||
|
import Utils from "../Utils";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To Hex operation
|
||||||
|
*/
|
||||||
|
class ToHex extends Operation {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ToHex constructor
|
||||||
|
*/
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.name = "To Hex";
|
||||||
|
this.module = "Default";
|
||||||
|
this.description = "Converts the input string to hexadecimal bytes separated by the specified delimiter.<br><br>e.g. The UTF-8 encoded string <code>Γειά σου</code> becomes <code>ce 93 ce b5 ce b9 ce ac 20 cf 83 ce bf cf 85 0a</code>";
|
||||||
|
this.inputType = "ArrayBuffer";
|
||||||
|
this.outputType = "string";
|
||||||
|
this.args = [
|
||||||
|
{
|
||||||
|
name: "Delimiter",
|
||||||
|
type: "option",
|
||||||
|
value: HEX_DELIM_OPTIONS
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {ArrayBuffer} input
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
run(input, args) {
|
||||||
|
const delim = Utils.charRep(args[0] || "Space");
|
||||||
|
return toHex(new Uint8Array(input), delim, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Highlight to Hex
|
||||||
|
*
|
||||||
|
* @param {Object[]} pos
|
||||||
|
* @param {number} pos[].start
|
||||||
|
* @param {number} pos[].end
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {Object[]} pos
|
||||||
|
*/
|
||||||
|
highlight(pos, args) {
|
||||||
|
const delim = Utils.charRep(args[0] || "Space"),
|
||||||
|
len = delim === "\r\n" ? 1 : delim.length;
|
||||||
|
|
||||||
|
pos[0].start = pos[0].start * (2 + len);
|
||||||
|
pos[0].end = pos[0].end * (2 + len) - len;
|
||||||
|
|
||||||
|
// 0x and \x are added to the beginning if they are selected, so increment the positions accordingly
|
||||||
|
if (delim === "0x" || delim === "\\x") {
|
||||||
|
pos[0].start += 2;
|
||||||
|
pos[0].end += 2;
|
||||||
|
}
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Highlight from Hex
|
||||||
|
*
|
||||||
|
* @param {Object[]} pos
|
||||||
|
* @param {number} pos[].start
|
||||||
|
* @param {number} pos[].end
|
||||||
|
* @param {Object[]} args
|
||||||
|
* @returns {Object[]} pos
|
||||||
|
*/
|
||||||
|
highlightReverse(pos, args) {
|
||||||
|
const delim = Utils.charRep(args[0] || "Space"),
|
||||||
|
len = delim === "\r\n" ? 1 : delim.length,
|
||||||
|
width = len + 2;
|
||||||
|
|
||||||
|
// 0x and \x are added to the beginning if they are selected, so increment the positions accordingly
|
||||||
|
if (delim === "0x" || delim === "\\x") {
|
||||||
|
if (pos[0].start > 1) pos[0].start -= 2;
|
||||||
|
else pos[0].start = 0;
|
||||||
|
if (pos[0].end > 1) pos[0].end -= 2;
|
||||||
|
else pos[0].end = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pos[0].start = pos[0].start === 0 ? 0 : Math.round(pos[0].start / width);
|
||||||
|
pos[0].end = pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / width);
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ToHex;
|
@ -3,11 +3,15 @@ import FromBase64 from "./FromBase64";
|
|||||||
import ToBase32 from "./ToBase32";
|
import ToBase32 from "./ToBase32";
|
||||||
import FromBase32 from "./FromBase32";
|
import FromBase32 from "./FromBase32";
|
||||||
import ShowBase64Offsets from "./ShowBase64Offsets";
|
import ShowBase64Offsets from "./ShowBase64Offsets";
|
||||||
|
import ToHex from "./ToHex";
|
||||||
|
import FromHex from "./FromHex";
|
||||||
|
|
||||||
export {
|
export {
|
||||||
ToBase64,
|
ToBase64,
|
||||||
FromBase64,
|
FromBase64,
|
||||||
ToBase32,
|
ToBase32,
|
||||||
FromBase32,
|
FromBase32,
|
||||||
ShowBase64Offsets
|
ShowBase64Offsets,
|
||||||
|
ToHex,
|
||||||
|
FromHex
|
||||||
};
|
};
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import Utils from "../Utils.js";
|
import Utils from "../Utils.js";
|
||||||
|
import {toHex} from "../lib/Hex";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -166,7 +167,7 @@ const BitwiseOp = {
|
|||||||
if (crib && resultUtf8.toLowerCase().indexOf(crib) < 0) continue;
|
if (crib && resultUtf8.toLowerCase().indexOf(crib) < 0) continue;
|
||||||
if (printKey) record += "Key = " + Utils.hex(key, (2*keyLength)) + ": ";
|
if (printKey) record += "Key = " + Utils.hex(key, (2*keyLength)) + ": ";
|
||||||
if (outputHex) {
|
if (outputHex) {
|
||||||
record += Utils.toHex(result);
|
record += toHex(result);
|
||||||
} else {
|
} else {
|
||||||
record += Utils.printable(resultUtf8, false);
|
record += Utils.printable(resultUtf8, false);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import Utils from "../Utils.js";
|
import Utils from "../Utils.js";
|
||||||
|
import {toHex, fromHex} from "../lib/Hex";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -17,42 +18,12 @@ const ByteRepr = {
|
|||||||
* @default
|
* @default
|
||||||
*/
|
*/
|
||||||
DELIM_OPTIONS: ["Space", "Comma", "Semi-colon", "Colon", "Line feed", "CRLF"],
|
DELIM_OPTIONS: ["Space", "Comma", "Semi-colon", "Colon", "Line feed", "CRLF"],
|
||||||
/**
|
|
||||||
* @constant
|
|
||||||
* @default
|
|
||||||
*/
|
|
||||||
HEX_DELIM_OPTIONS: ["Space", "Comma", "Semi-colon", "Colon", "Line feed", "CRLF", "0x", "\\x", "None"],
|
|
||||||
/**
|
/**
|
||||||
* @constant
|
* @constant
|
||||||
* @default
|
* @default
|
||||||
*/
|
*/
|
||||||
BIN_DELIM_OPTIONS: ["Space", "Comma", "Semi-colon", "Colon", "Line feed", "CRLF", "None"],
|
BIN_DELIM_OPTIONS: ["Space", "Comma", "Semi-colon", "Colon", "Line feed", "CRLF", "None"],
|
||||||
|
|
||||||
/**
|
|
||||||
* To Hex operation.
|
|
||||||
*
|
|
||||||
* @param {ArrayBuffer} input
|
|
||||||
* @param {Object[]} args
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
runToHex: function(input, args) {
|
|
||||||
const delim = Utils.charRep(args[0] || "Space");
|
|
||||||
return Utils.toHex(new Uint8Array(input), delim, 2);
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* From Hex operation.
|
|
||||||
*
|
|
||||||
* @param {string} input
|
|
||||||
* @param {Object[]} args
|
|
||||||
* @returns {byteArray}
|
|
||||||
*/
|
|
||||||
runFromHex: function(input, args) {
|
|
||||||
const delim = args[0] || "Space";
|
|
||||||
return Utils.fromHex(input, delim, 2);
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To Octal operation.
|
* To Octal operation.
|
||||||
@ -171,59 +142,6 @@ const ByteRepr = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Highlight to hex
|
|
||||||
*
|
|
||||||
* @param {Object[]} pos
|
|
||||||
* @param {number} pos[].start
|
|
||||||
* @param {number} pos[].end
|
|
||||||
* @param {Object[]} args
|
|
||||||
* @returns {Object[]} pos
|
|
||||||
*/
|
|
||||||
highlightTo: function(pos, args) {
|
|
||||||
let delim = Utils.charRep(args[0] || "Space"),
|
|
||||||
len = delim === "\r\n" ? 1 : delim.length;
|
|
||||||
|
|
||||||
pos[0].start = pos[0].start * (2 + len);
|
|
||||||
pos[0].end = pos[0].end * (2 + len) - len;
|
|
||||||
|
|
||||||
// 0x and \x are added to the beginning if they are selected, so increment the positions accordingly
|
|
||||||
if (delim === "0x" || delim === "\\x") {
|
|
||||||
pos[0].start += 2;
|
|
||||||
pos[0].end += 2;
|
|
||||||
}
|
|
||||||
return pos;
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Highlight from hex
|
|
||||||
*
|
|
||||||
* @param {Object[]} pos
|
|
||||||
* @param {number} pos[].start
|
|
||||||
* @param {number} pos[].end
|
|
||||||
* @param {Object[]} args
|
|
||||||
* @returns {Object[]} pos
|
|
||||||
*/
|
|
||||||
highlightFrom: function(pos, args) {
|
|
||||||
let delim = Utils.charRep(args[0] || "Space"),
|
|
||||||
len = delim === "\r\n" ? 1 : delim.length,
|
|
||||||
width = len + 2;
|
|
||||||
|
|
||||||
// 0x and \x are added to the beginning if they are selected, so increment the positions accordingly
|
|
||||||
if (delim === "0x" || delim === "\\x") {
|
|
||||||
if (pos[0].start > 1) pos[0].start -= 2;
|
|
||||||
else pos[0].start = 0;
|
|
||||||
if (pos[0].end > 1) pos[0].end -= 2;
|
|
||||||
else pos[0].end = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
pos[0].start = pos[0].start === 0 ? 0 : Math.round(pos[0].start / width);
|
|
||||||
pos[0].end = pos[0].end === 0 ? 0 : Math.ceil(pos[0].end / width);
|
|
||||||
return pos;
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To Decimal operation.
|
* To Decimal operation.
|
||||||
*
|
*
|
||||||
@ -357,7 +275,7 @@ const ByteRepr = {
|
|||||||
const convert = args[0];
|
const convert = args[0];
|
||||||
const spaces = args[1];
|
const spaces = args[1];
|
||||||
if (convert === "All chars") {
|
if (convert === "All chars") {
|
||||||
let result = "|" + Utils.toHex(input) + "|";
|
let result = "|" + toHex(input) + "|";
|
||||||
if (!spaces) result = result.replace(/ /g, "");
|
if (!spaces) result = result.replace(/ /g, "");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -373,7 +291,7 @@ const ByteRepr = {
|
|||||||
output += "|";
|
output += "|";
|
||||||
inHex = true;
|
inHex = true;
|
||||||
} else if (spaces) output += " ";
|
} else if (spaces) output += " ";
|
||||||
output += Utils.toHex([b]);
|
output += toHex([b]);
|
||||||
} else {
|
} else {
|
||||||
if (inHex) {
|
if (inHex) {
|
||||||
output += "|";
|
output += "|";
|
||||||
@ -403,7 +321,7 @@ const ByteRepr = {
|
|||||||
output.push(Utils.ord(input[i++]));
|
output.push(Utils.ord(input[i++]));
|
||||||
|
|
||||||
// Add match
|
// Add match
|
||||||
const bytes = Utils.fromHex(m[1]);
|
const bytes = fromHex(m[1]);
|
||||||
if (bytes) {
|
if (bytes) {
|
||||||
for (let a = 0; a < bytes.length;)
|
for (let a = 0; a < bytes.length;)
|
||||||
output.push(bytes[a++]);
|
output.push(bytes[a++]);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import Utils from "../Utils.js";
|
import Utils from "../Utils.js";
|
||||||
import {toBase64} from "../lib/Base64";
|
import {toBase64} from "../lib/Base64";
|
||||||
|
import {toHexFast} from "../lib/Hex";
|
||||||
import CryptoJS from "crypto-js";
|
import CryptoJS from "crypto-js";
|
||||||
import forge from "imports-loader?jQuery=>null!node-forge/dist/forge.min.js";
|
import forge from "imports-loader?jQuery=>null!node-forge/dist/forge.min.js";
|
||||||
import {blowfish as Blowfish} from "sladex-blowfish";
|
import {blowfish as Blowfish} from "sladex-blowfish";
|
||||||
@ -403,7 +404,7 @@ DES uses a key length of 8 bytes (64 bits).`;
|
|||||||
cipherMode: Cipher._BLOWFISH_MODE_LOOKUP[mode]
|
cipherMode: Cipher._BLOWFISH_MODE_LOOKUP[mode]
|
||||||
});
|
});
|
||||||
|
|
||||||
return outputType === "Hex" ? Utils.toHexFast(Utils.strToByteArray(result)) : result;
|
return outputType === "Hex" ? toHexFast(Utils.strToByteArray(result)) : result;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import Utils from "../Utils.js";
|
import Utils from "../Utils.js";
|
||||||
|
import {toHex, fromHex} from "../lib/Hex";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,7 +53,7 @@ const Endian = {
|
|||||||
// Convert input to raw data based on specified data format
|
// Convert input to raw data based on specified data format
|
||||||
switch (dataFormat) {
|
switch (dataFormat) {
|
||||||
case "Hex":
|
case "Hex":
|
||||||
data = Utils.fromHex(input);
|
data = fromHex(input);
|
||||||
break;
|
break;
|
||||||
case "Raw":
|
case "Raw":
|
||||||
data = Utils.strToByteArray(input);
|
data = Utils.strToByteArray(input);
|
||||||
@ -86,7 +87,7 @@ const Endian = {
|
|||||||
// Convert data back to specified data format
|
// Convert data back to specified data format
|
||||||
switch (dataFormat) {
|
switch (dataFormat) {
|
||||||
case "Hex":
|
case "Hex":
|
||||||
return Utils.toHex(result);
|
return toHex(result);
|
||||||
case "Raw":
|
case "Raw":
|
||||||
return Utils.byteArrayToUtf8(result);
|
return Utils.byteArrayToUtf8(result);
|
||||||
default:
|
default:
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import Utils from "../Utils.js";
|
import Utils from "../Utils.js";
|
||||||
|
import {fromHex} from "../lib/Hex";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -82,7 +83,7 @@ const Hexdump = {
|
|||||||
block, line;
|
block, line;
|
||||||
|
|
||||||
while ((block = regex.exec(input))) {
|
while ((block = regex.exec(input))) {
|
||||||
line = Utils.fromHex(block[1].replace(/-/g, " "));
|
line = fromHex(block[1].replace(/-/g, " "));
|
||||||
for (let i = 0; i < line.length; i++) {
|
for (let i = 0; i < line.length; i++) {
|
||||||
output.push(line[i]);
|
output.push(line[i]);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import Utils from "../Utils.js";
|
import Utils from "../Utils.js";
|
||||||
|
import {toHex, fromHex} from "../lib/Hex";
|
||||||
import Checksum from "./Checksum.js";
|
import Checksum from "./Checksum.js";
|
||||||
import {BigInteger} from "jsbn";
|
import {BigInteger} from "jsbn";
|
||||||
|
|
||||||
@ -283,7 +284,7 @@ const IP = {
|
|||||||
baIp.push(decimal & 255);
|
baIp.push(decimal & 255);
|
||||||
break;
|
break;
|
||||||
case "Hex":
|
case "Hex":
|
||||||
baIp = Utils.fromHex(lines[i]);
|
baIp = fromHex(lines[i]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw "Unsupported input IP format";
|
throw "Unsupported input IP format";
|
||||||
@ -445,7 +446,7 @@ const IP = {
|
|||||||
output;
|
output;
|
||||||
|
|
||||||
if (format === "Hex") {
|
if (format === "Hex") {
|
||||||
input = Utils.fromHex(input);
|
input = fromHex(input);
|
||||||
} else if (format === "Raw") {
|
} else if (format === "Raw") {
|
||||||
input = Utils.strToByteArray(input);
|
input = Utils.strToByteArray(input);
|
||||||
} else {
|
} else {
|
||||||
@ -516,7 +517,7 @@ const IP = {
|
|||||||
"<tr><td>Destination IP address</td><td>" + IP._ipv4ToStr(dstIP) + "</td></tr>";
|
"<tr><td>Destination IP address</td><td>" + IP._ipv4ToStr(dstIP) + "</td></tr>";
|
||||||
|
|
||||||
if (ihl > 5) {
|
if (ihl > 5) {
|
||||||
output += "<tr><td>Options</td><td>" + Utils.toHex(options) + "</td></tr>";
|
output += "<tr><td>Options</td><td>" + toHex(options) + "</td></tr>";
|
||||||
}
|
}
|
||||||
|
|
||||||
return output + "</table>";
|
return output + "</table>";
|
||||||
|
@ -3,6 +3,7 @@ import removeEXIF from "../vendor/remove-exif.js";
|
|||||||
import Utils from "../Utils.js";
|
import Utils from "../Utils.js";
|
||||||
import FileType from "./FileType.js";
|
import FileType from "./FileType.js";
|
||||||
import {fromBase64, toBase64} from "../lib/Base64";
|
import {fromBase64, toBase64} from "../lib/Base64";
|
||||||
|
import {fromHex} from "../lib/Hex";
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -92,7 +93,7 @@ const Image = {
|
|||||||
// Convert input to raw bytes
|
// Convert input to raw bytes
|
||||||
switch (inputFormat) {
|
switch (inputFormat) {
|
||||||
case "Hex":
|
case "Hex":
|
||||||
input = Utils.fromHex(input);
|
input = fromHex(input);
|
||||||
break;
|
break;
|
||||||
case "Base64":
|
case "Base64":
|
||||||
// Don't trust the Base64 entered by the user.
|
// Don't trust the Base64 entered by the user.
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import Utils from "../Utils.js";
|
import Utils from "../Utils.js";
|
||||||
import {fromBase64} from "../lib/Base64";
|
import {fromBase64} from "../lib/Base64";
|
||||||
|
import {toHex, fromHex} from "../lib/Hex";
|
||||||
import * as r from "jsrsasign";
|
import * as r from "jsrsasign";
|
||||||
|
|
||||||
|
|
||||||
@ -44,10 +45,10 @@ const PublicKey = {
|
|||||||
cert.readCertPEM(input);
|
cert.readCertPEM(input);
|
||||||
break;
|
break;
|
||||||
case "Base64":
|
case "Base64":
|
||||||
cert.readCertHex(Utils.toHex(fromBase64(input, null, "byteArray"), ""));
|
cert.readCertHex(toHex(fromBase64(input, null, "byteArray"), ""));
|
||||||
break;
|
break;
|
||||||
case "Raw":
|
case "Raw":
|
||||||
cert.readCertHex(Utils.toHex(Utils.strToByteArray(input), ""));
|
cert.readCertHex(toHex(Utils.strToByteArray(input), ""));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw "Undefined input format";
|
throw "Undefined input format";
|
||||||
@ -305,7 +306,7 @@ ${extensions}`;
|
|||||||
* @returns {string}
|
* @returns {string}
|
||||||
*/
|
*/
|
||||||
_formatByteStr: function(byteStr, length, indent) {
|
_formatByteStr: function(byteStr, length, indent) {
|
||||||
byteStr = Utils.toHex(Utils.fromHex(byteStr), ":");
|
byteStr = toHex(fromHex(byteStr), ":");
|
||||||
length = length * 3;
|
length = length * 3;
|
||||||
let output = "";
|
let output = "";
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import Utils from "../Utils.js";
|
import Utils from "../Utils.js";
|
||||||
|
import {fromHex} from "../lib/Hex";
|
||||||
import jsesc from "jsesc";
|
import jsesc from "jsesc";
|
||||||
|
|
||||||
|
|
||||||
@ -380,8 +381,8 @@ const StrUtils = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (inputType === "Hex") {
|
if (inputType === "Hex") {
|
||||||
samples[0] = Utils.fromHex(samples[0]);
|
samples[0] = fromHex(samples[0]);
|
||||||
samples[1] = Utils.fromHex(samples[1]);
|
samples[1] = fromHex(samples[1]);
|
||||||
} else {
|
} else {
|
||||||
samples[0] = Utils.strToByteArray(samples[0]);
|
samples[0] = Utils.strToByteArray(samples[0]);
|
||||||
samples[1] = Utils.strToByteArray(samples[1]);
|
samples[1] = Utils.strToByteArray(samples[1]);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user