Add octal support to Change IP Format.

Also add test cases covering interchanging between all four
formats.
This commit is contained in:
Chris Smith 2019-08-24 01:14:44 +01:00
parent d3e3e6e6fc
commit 6c9ce15b26
No known key found for this signature in database
GPG Key ID: 3A2D4BBDC4A3C9A9
3 changed files with 79 additions and 8 deletions

View File

@ -29,12 +29,12 @@ class ChangeIPFormat extends Operation {
{
"name": "Input format",
"type": "option",
"value": ["Dotted Decimal", "Decimal", "Hex"]
"value": ["Dotted Decimal", "Decimal", "Octal", "Hex"]
},
{
"name": "Output format",
"type": "option",
"value": ["Dotted Decimal", "Decimal", "Hex"]
"value": ["Dotted Decimal", "Decimal", "Octal", "Hex"]
}
];
}
@ -54,7 +54,6 @@ class ChangeIPFormat extends Operation {
if (lines[i] === "") continue;
let baIp = [];
let octets;
let decimal;
if (inFormat === outFormat) {
output += lines[i] + "\n";
@ -70,11 +69,10 @@ class ChangeIPFormat extends Operation {
}
break;
case "Decimal":
decimal = lines[i].toString();
baIp.push(decimal >> 24 & 255);
baIp.push(decimal >> 16 & 255);
baIp.push(decimal >> 8 & 255);
baIp.push(decimal & 255);
baIp = this.fromNumber(lines[i].toString(), 10);
break;
case "Octal":
baIp = this.fromNumber(lines[i].toString(), 8);
break;
case "Hex":
baIp = fromHex(lines[i]);
@ -100,6 +98,10 @@ class ChangeIPFormat extends Operation {
decIp = ((baIp[0] << 24) | (baIp[1] << 16) | (baIp[2] << 8) | baIp[3]) >>> 0;
output += decIp.toString() + "\n";
break;
case "Octal":
decIp = ((baIp[0] << 24) | (baIp[1] << 16) | (baIp[2] << 8) | baIp[3]) >>> 0;
output += "0" + decIp.toString(8) + "\n";
break;
case "Hex":
hexIp = "";
for (j = 0; j < baIp.length; j++) {
@ -115,6 +117,22 @@ class ChangeIPFormat extends Operation {
return output.slice(0, output.length-1);
}
/**
* Constructs an array of IP address octets from a numerical value.
* @param {string} value The value of the IP address
* @param {number} radix The numeral system to be used
* @returns {number[]}
*/
fromNumber(value, radix) {
const decimal = parseInt(value, radix);
const baIp = [];
baIp.push(decimal >> 24 & 255);
baIp.push(decimal >> 16 & 255);
baIp.push(decimal >> 8 & 255);
baIp.push(decimal & 255);
return baIp;
}
}
export default ChangeIPFormat;

View File

@ -26,6 +26,7 @@ import "./tests/BitwiseOp";
import "./tests/ByteRepr";
import "./tests/CartesianProduct";
import "./tests/CharEnc";
import "./tests/ChangeIPFormat";
import "./tests/Charts";
import "./tests/Checksum";
import "./tests/Ciphers";

View File

@ -0,0 +1,52 @@
/**
* Change IP format tests.
*
* @author Chris Smith
* @copyright Crown Copyright 2019
* @license Apache-2.0
*/
import TestRegister from "../../lib/TestRegister.mjs";
TestRegister.addTests([
{
name: "Change IP format: Dotted Decimal to Hex",
input: "192.168.1.1",
expectedOutput: "c0a80101",
recipeConfig: [
{
op: "Change IP format",
args: ["Dotted Decimal", "Hex"],
},
],
}, {
name: "Change IP format: Decimal to Dotted Decimal",
input: "3232235777",
expectedOutput: "192.168.1.1",
recipeConfig: [
{
op: "Change IP format",
args: ["Decimal", "Dotted Decimal"],
},
],
}, {
name: "Change IP format: Hex to Octal",
input: "c0a80101",
expectedOutput: "030052000401",
recipeConfig: [
{
op: "Change IP format",
args: ["Hex", "Octal"],
},
],
}, {
name: "Change IP format: Octal to Decimal",
input: "030052000401",
expectedOutput: "3232235777",
recipeConfig: [
{
op: "Change IP format",
args: ["Octal", "Decimal"],
},
],
},
]);