はじめてのJScript+WSH 番外1 CIDR表記を変換

はじめに

192.168.1.0/24といったCIDR表記のアドレスを
192.168.1.0 255.255.255.0とサブネットを使った表記や
192.168.1.0 0.0.0.255といったワイルドカードマスクを使った表記に
変換してみます。

ポイント

べき乗(x^y)は Math.pow(x, y) と書きます。
"1"や"13"といった文字列の数値を10進数の数値に変換する場合、parseint(str, 10)と記載します。

ごり押し編

行数は多いものの、修正や理解が簡単というメリットがあると思います。

CIDR→サブネットマスク

※x.x.x.x/32 は hosts x.x.x.x と書きがちですが、ここでは x.x.x.x 255.255.255.255としています。

var seg1 = "127.0.0.1/32";
var seg2 = "192.168.1.0/24";
var seg3 = "172.16.0.0/16";
var seg4 = "10.0.0.0/8";
var seg5 = "1.2.3.4";


// "192.168.1.0/24" => "192.168.1.0 255.255.255.0"
var toSubnetmaskFromCIDR = function(strTemp){
    var strReturn;

    // フォーマットを満たさない場合はそのまま返す
    if(!(strTemp.search( /\d+\.\d+\.\d+\.\d+\/\d+/) > -1)){
        return strTemp;

    // フォーマットを満たしたらサブネットマスクに変えて返す
    }else{

        var arrTemp = strTemp.split("/");

        if(arrTemp[1] == "32") strReturn = arrTemp[0] + " 255.255.255.255";
        if(arrTemp[1] == "31") strReturn = arrTemp[0] + " 255.255.255.252";
        if(arrTemp[1] == "30") strReturn = arrTemp[0] + " 255.255.255.248";
        if(arrTemp[1] == "29") strReturn = arrTemp[0] + " 255.255.255.240";
        if(arrTemp[1] == "28") strReturn = arrTemp[0] + " 255.255.255.224";
        if(arrTemp[1] == "27") strReturn = arrTemp[0] + " 255.255.255.192";
        if(arrTemp[1] == "26") strReturn = arrTemp[0] + " 255.255.255.128";
        if(arrTemp[1] == "25") strReturn = arrTemp[0] + " 255.255.255.0";
        if(arrTemp[1] == "24") strReturn = arrTemp[0] + " 255.255.255.0";
        if(arrTemp[1] == "23") strReturn = arrTemp[0] + " 255.255.252.0";
        if(arrTemp[1] == "22") strReturn = arrTemp[0] + " 255.255.248.0";
        if(arrTemp[1] == "21") strReturn = arrTemp[0] + " 255.255.240.0";
        if(arrTemp[1] == "20") strReturn = arrTemp[0] + " 255.255.224.0";
        if(arrTemp[1] == "19") strReturn = arrTemp[0] + " 255.255.192.0";
        if(arrTemp[1] == "18") strReturn = arrTemp[0] + " 255.255.128.0";
        if(arrTemp[1] == "17") strReturn = arrTemp[0] + " 255.255.0.0";
        if(arrTemp[1] == "16") strReturn = arrTemp[0] + " 255.255.0.0";
        if(arrTemp[1] == "15") strReturn = arrTemp[0] + " 255.252.0.0"; 
        if(arrTemp[1] == "14") strReturn = arrTemp[0] + " 255.254.0.0";
        if(arrTemp[1] == "13") strReturn = arrTemp[0] + " 255.248.0.0";
        if(arrTemp[1] == "12") strReturn = arrTemp[0] + " 255.240.0.0";
        if(arrTemp[1] == "11") strReturn = arrTemp[0] + " 255.224.0.0";
        if(arrTemp[1] == "10") strReturn = arrTemp[0] + " 255.192.0.0";
        if(arrTemp[1] ==  "9") strReturn = arrTemp[0] + " 255.128.0.0";
        if(arrTemp[1] ==  "8") strReturn = arrTemp[0] + " 255.0.0.0";
        if(arrTemp[1] ==  "7") strReturn = arrTemp[0] + " 254.0.0.0";
        if(arrTemp[1] ==  "6") strReturn = arrTemp[0] + " 252.0.0.0";
        if(arrTemp[1] ==  "5") strReturn = arrTemp[0] + " 248.0.0.0";
        if(arrTemp[1] ==  "4") strReturn = arrTemp[0] + " 240.0.0.0";
        if(arrTemp[1] ==  "3") strReturn = arrTemp[0] + " 224.0.0.0";
        if(arrTemp[1] ==  "2") strReturn = arrTemp[0] + " 192.0.0.0";
        if(arrTemp[1] ==  "1") strReturn = arrTemp[0] + " 128.0.0.0";
        if(arrTemp[1] ==  "0") strReturn = arrTemp[0] + " 0.0.0.0";

        return strReturn;

    }
}



WScript.echo(toSubnetmaskFromCIDR(seg1));
WScript.echo(toSubnetmaskFromCIDR(seg2));
WScript.echo(toSubnetmaskFromCIDR(seg3));
WScript.echo(toSubnetmaskFromCIDR(seg4));
WScript.echo(toSubnetmaskFromCIDR(seg5));


CIDR→ワイルドカードマスク

※x.x.x.x/32 は hosts x.x.x.x と書きがちですが、ここでは x.x.x.x 0.0.0.0としています。

var seg1 = "127.0.0.1/32";
var seg2 = "192.168.1.0/24";
var seg3 = "172.16.0.0/16";
var seg4 = "10.0.0.0/8";
var seg5 = "1.2.3.4";

// "192.168.1.0/24" => "192.168.1.0 0.0.0.255"
var toWildcardmaskFromCIDR = function(strTemp){
    var strReturn;

    // フォーマットを満たさない場合はそのまま返す
    if(!(strTemp.search( /\d+\.\d+\.\d+\.\d+\/\d+/) > -1)){
        return strTemp;

    // フォーマットを満たしたらサブネットマスクに変えて返す
    }else{

        var arrTemp = strTemp.split("/");

        if(arrTemp[1] == "32") strReturn = arrTemp[0] + " 0.0.0.0";
        if(arrTemp[1] == "31") strReturn = arrTemp[0] + " 0.0.0.1";
        if(arrTemp[1] == "30") strReturn = arrTemp[0] + " 0.0.0.3";
        if(arrTemp[1] == "29") strReturn = arrTemp[0] + " 0.0.0.7";
        if(arrTemp[1] == "28") strReturn = arrTemp[0] + " 0.0.0.15";
        if(arrTemp[1] == "27") strReturn = arrTemp[0] + " 0.0.0.31";
        if(arrTemp[1] == "26") strReturn = arrTemp[0] + " 0.0.0.63";
        if(arrTemp[1] == "25") strReturn = arrTemp[0] + " 0.0.0.127";
        if(arrTemp[1] == "24") strReturn = arrTemp[0] + " 0.0.0.255";
        if(arrTemp[1] == "23") strReturn = arrTemp[0] + " 0.0.1.255";
        if(arrTemp[1] == "22") strReturn = arrTemp[0] + " 0.0.3.255";
        if(arrTemp[1] == "21") strReturn = arrTemp[0] + " 0.0.7.255";
        if(arrTemp[1] == "20") strReturn = arrTemp[0] + " 0.0.15.255";
        if(arrTemp[1] == "19") strReturn = arrTemp[0] + " 0.0.31.255";
        if(arrTemp[1] == "18") strReturn = arrTemp[0] + " 0.0.63.255";
        if(arrTemp[1] == "17") strReturn = arrTemp[0] + " 0.0.127.255";
        if(arrTemp[1] == "16") strReturn = arrTemp[0] + " 0.0.255.255";
        if(arrTemp[1] == "15") strReturn = arrTemp[0] + " 0.1.255.255";
        if(arrTemp[1] == "14") strReturn = arrTemp[0] + " 0.3.255.255";
        if(arrTemp[1] == "13") strReturn = arrTemp[0] + " 0.7.255.255";
        if(arrTemp[1] == "12") strReturn = arrTemp[0] + " 0.15.255.255";
        if(arrTemp[1] == "11") strReturn = arrTemp[0] + " 0.31.255.255";
        if(arrTemp[1] == "10") strReturn = arrTemp[0] + " 0.63.255.255";
        if(arrTemp[1] ==  "9") strReturn = arrTemp[0] + " 0.127.255.255";
        if(arrTemp[1] ==  "8") strReturn = arrTemp[0] + " 0.255.255.255";
        if(arrTemp[1] ==  "7") strReturn = arrTemp[0] + " 1.255.255.255";
        if(arrTemp[1] ==  "6") strReturn = arrTemp[0] + " 3.255.255.255";
        if(arrTemp[1] ==  "5") strReturn = arrTemp[0] + " 7.255.255.255";
        if(arrTemp[1] ==  "4") strReturn = arrTemp[0] + " 15.255.255.255";
        if(arrTemp[1] ==  "3") strReturn = arrTemp[0] + " 31.255.255.255";
        if(arrTemp[1] ==  "2") strReturn = arrTemp[0] + " 63.255.255.255";
        if(arrTemp[1] ==  "1") strReturn = arrTemp[0] + " 127.255.255.255";
        if(arrTemp[1] ==  "0") strReturn = arrTemp[0] + " 255.255.255.255";


        return strReturn;

    }
}



WScript.echo(toWildcardmaskFromCIDR(seg1));
WScript.echo(toWildcardmaskFromCIDR(seg2));
WScript.echo(toWildcardmaskFromCIDR(seg3));
WScript.echo(toWildcardmaskFromCIDR(seg4));
WScript.echo(toWildcardmaskFromCIDR(seg5));

工夫してみた

サブネットマスクやワイルドカードマスクを数値計算で生成するようにしました。

var toSubnetMask = function(pf){
    var num = parseInt(pf, 10);

    if(num == 0){
        return "0.0.0.0";
    }else if(num - 8 <= 0){
        return "" + (256 - Math.pow(2, 8 - num)) + ".0.0.0";
    }else if(num - 16 <= 0){
        return "255." + (256 - Math.pow(2, 16 - num)) + ".0.0";
    }else if(num - 24 <= 0){
        return "255.255." + (256 - Math.pow(2, 24 - num)) + ".0";
    }else if(num - 32 <= 0){
        return "255.255.255." + (256 - Math.pow(2, 32 - num)) + "";
    }
}

// "192.168.1.0/24" => "192.168.1.0 255.255.255.0"
var toSubnetmaskFromCIDR = function(strTemp){
    var strReturn;

    // フォーマットを満たさない場合はそのまま返す
    if(!(strTemp.search( /\d+\.\d+\.\d+\.\d+\/\d+/) > -1)){
        return strTemp;

    // フォーマットを満たしたらサブネットマスクに変えて返す
    }else{

        var arrTemp = strTemp.split("/");

        return strReturn = arrTemp[0] + " " + toSubnetMask(arrTemp[1]);
    }
}

var toWildcardMask = function(pf){
    var num = parseInt(pf, 10);

    if(num == 0){
        return "255.255.255.255";
    }else if(num - 8 <= 0){
        return "" + (Math.pow(2, 8 - num) - 1) + ".255.255.255";
    }else if(num - 16 <= 0){
        return "0." + (Math.pow(2, 16 - num) - 1) + ".255.255";
    }else if(num - 24 <= 0){
        return "0.0." + (Math.pow(2, 24 - num) - 1) + ".255";
    }else if(num - 32 <= 0){
        return "0.0.0." + (Math.pow(2, 32 - num) - 1) + "";
    }
}


// "192.168.1.0/24" => "192.168.1.0 255.255.255.0"
var toWildcardmaskFromCIDR = function(strTemp){
    var strReturn;

    // フォーマットを満たさない場合はそのまま返す
    if(!(strTemp.search( /\d+\.\d+\.\d+\.\d+\/\d+/) > -1)){
        return strTemp;

    // フォーマットを満たしたらサブネットマスクに変えて返す
    }else{

        var arrTemp = strTemp.split("/");

        return arrTemp[0] + " " + toWildcardMask(arrTemp[1]);

    }
}

おわりに

24とかを11111111111111111111111100000000とかに変換して、
左から8個ずつに分けて、1の数だけ2乗って手もありそうです。

この記事が気に入ったらサポートをしてみませんか?