Bladeren bron

Ported the ChangeIPFormat operation.

Callum Fraser 7 jaren geleden
bovenliggende
commit
792218df9c
1 gewijzigde bestanden met toevoegingen van 121 en 0 verwijderingen
  1. 121 0
      src/core/operations/ChangeIPFormat.mjs

+ 121 - 0
src/core/operations/ChangeIPFormat.mjs

@@ -0,0 +1,121 @@
+/**
+ * @author n1474335 [n1474335@gmail.com]
+ * @copyright Crown Copyright 2016
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation";
+import Utils from "../Utils";
+import {fromHex} from "../lib/Hex";
+
+/**
+ * Change IP format operation
+ */
+class ChangeIPFormat extends Operation {
+
+    /**
+     * ChangeIPFormat constructor
+     */
+    constructor() {
+        super();
+
+        this.name = "Change IP format";
+        this.module = "JSBN";
+        this.description = "Convert an IP address from one format to another, e.g. <code>172.20.23.54</code> to <code>ac141736</code>";
+        this.inputType = "string";
+        this.outputType = "string";
+        this.args = [
+            {
+                "name": "Input format",
+                "type": "option",
+                "value": ["Hex", "Raw"]
+            },
+            {
+                "name": "Output format",
+                "type": "option",
+                "value": ["Hex", "Raw"]
+            }
+        ];
+    }
+
+    /**
+     * @param {string} input
+     * @param {Object[]} args
+     * @returns {string}
+     */
+    run(input, args) {
+        const inFormat = args[0],
+            outFormat = args[1],
+            lines = input.split("\n");
+        let output = "",
+            j = 0;
+
+
+        for (let i = 0; i < lines.length; i++) {
+            if (lines[i] === "") continue;
+            let baIp = [];
+            let octets;
+            let decimal;
+
+            if (inFormat === outFormat) {
+                output += lines[i] + "\n";
+                continue;
+            }
+
+            // Convert to byte array IP from input format
+            switch (inFormat) {
+                case "Dotted Decimal":
+                    octets = lines[i].split(".");
+                    for (j = 0; j < octets.length; j++) {
+                        baIp.push(parseInt(octets[j], 10));
+                    }
+                    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);
+                    break;
+                case "Hex":
+                    baIp = fromHex(lines[i]);
+                    break;
+                default:
+                    throw "Unsupported input IP format";
+            }
+
+            let ddIp;
+            let decIp;
+            let hexIp;
+
+            // Convert byte array IP to output format
+            switch (outFormat) {
+                case "Dotted Decimal":
+                    ddIp = "";
+                    for (j = 0; j < baIp.length; j++) {
+                        ddIp += baIp[j] + ".";
+                    }
+                    output += ddIp.slice(0, ddIp.length-1) + "\n";
+                    break;
+                case "Decimal":
+                    decIp = ((baIp[0] << 24) | (baIp[1] << 16) | (baIp[2] << 8) | baIp[3]) >>> 0;
+                    output += decIp.toString() + "\n";
+                    break;
+                case "Hex":
+                    hexIp = "";
+                    for (j = 0; j < baIp.length; j++) {
+                        hexIp += Utils.hex(baIp[j]);
+                    }
+                    output += hexIp + "\n";
+                    break;
+                default:
+                    throw "Unsupported output IP format";
+            }
+        }
+
+        return output.slice(0, output.length-1);
+    }
+
+}
+
+export default ChangeIPFormat;