diff --git a/src/core/lib/Hex.mjs b/src/core/lib/Hex.mjs index 78e1ad58..806b0dd2 100644 --- a/src/core/lib/Hex.mjs +++ b/src/core/lib/Hex.mjs @@ -100,12 +100,15 @@ export function toHexFast(data) { * // returns [10,20,30] * fromHex("0a:14:1e", "Colon"); */ -export function fromHex(data, delim="Auto", byteLen=2) { +export function fromHex(data, delim="Auto", byteLen=2, removeNonAlphChars=false) { if (byteLen < 1 || Math.round(byteLen) !== byteLen) throw new OperationError("Byte length must be a positive integer"); + if (removeNonAlphChars) + data = data.replace(/[^\da-fA-F]/g, ""); + if (delim !== "None") { - const delimRegex = delim === "Auto" ? /[^a-f\d]|0x/gi : Utils.regexRep(delim); + const delimRegex = delim === "Auto" ? /\s+|0x/gi : Utils.regexRep(delim); data = data.split(delimRegex); } else { data = [data]; @@ -113,6 +116,8 @@ export function fromHex(data, delim="Auto", byteLen=2) { const output = []; for (let i = 0; i < data.length; i++) { + if (/[^a-f\d\s]/.test(data[i])) + throw new OperationError("Hex input must only contain hex digits"); for (let j = 0; j < data[i].length; j += byteLen) { output.push(parseInt(data[i].substr(j, byteLen), 16)); } diff --git a/src/core/operations/FromHex.mjs b/src/core/operations/FromHex.mjs index cd82d7df..9bc78403 100644 --- a/src/core/operations/FromHex.mjs +++ b/src/core/operations/FromHex.mjs @@ -30,6 +30,11 @@ class FromHex extends Operation { name: "Delimiter", type: "option", value: FROM_HEX_DELIM_OPTIONS + }, + { + name: "Remove non-alphabet chars", + type: "boolean", + value: true } ]; this.checks = [ @@ -92,8 +97,8 @@ class FromHex extends Operation { * @returns {byteArray} */ run(input, args) { - const delim = args[0] || "Auto"; - return fromHex(input, delim, 2); + const [delim, removeNonAlphChars] = [args[0] || "Auto", args[1]]; + return fromHex(input, delim, 2, removeNonAlphChars); } /**