はじめての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乗って手もありそうです。