1

私は実際にこれを機能させていますが、それは非常に醜く、それを達成するための雄弁なコードを考え出そうとして夜に目を覚まし続けています。

IP範囲を表す一連の文字列を取得し、その文字列が表す実際のIPアドレスの数を決定する必要があります。私のアプローチは、それを4オクテットに分割し、次に各オクテットを分割してそこから計算を行うことでした。

例:1.2.3.4-6は1.2.3.4、1.2.3.5、および1.2.3.6を表すため、この範囲から3の答えを取得したいと思います。

さらに複雑なことに、私が始めている文字列は、テキストボックスからのそのような範囲のリストであり、改行で区切られている可能性があるため、各行を個別に調べて、表されたIPアドレスの数を取得し、最後にどのように送信された範囲の多くにこの条件があります。

1.1.1.4-6     /* Represents 3 actual IP Addresses, need to know "3" */
2.2.3-10.255  /* Represents 8 actual IP Addresses, need to   know "8" */
3.3.3.3       /* No ranges specified, skip this
4.4.4.4       /* No ranges specified, skip this

最終的な結果として、2行に8つのIPアドレス(3 + 8)を表す「範囲」が含まれていることがわかります。

どんな雄弁な解決策も私の睡眠スケジュールによって高く評価されるでしょう。:)

4

2 に答える 2

3

そこに行きます:

var ips = ["1.2.3.4", "2.3.4-6.7", "1.2.3.4-12"];
for(var i=0; i<ips.length; i++) {
    var num = 1;
    var ip = ips[i];
    var parts = ip.split('.');
    for(var j=0; j<parts.length; j++) {
        var part = parts[j];
        if(/-/.test(part)) {
            var range = part.split('-');
            num *= parseInt(range[1]) - parseInt(range[0]) + 1;
        }
    }
    alert(ip + " has " + num + " ips.");
}​

このコードは、範囲を1.2.3-4.0-255正しく処理します(つまり、その範囲で256 * 2 = 512 ips)。num範囲のないリストアイテムは合計1ipを生成し、不要な場合は結果に基づいて無視できます。

おそらく私の例を少し変更する必要がありますが、そうすることで問題が発生することはないと確信しています。

于 2012-05-02T16:42:45.693 に答える
2

わかりました、これは私がそれをする方法です

var addr = '1.1.3-10.4-6';

function getNumAddresses(input) {
    var chunks = input.split('.');
    var result = 1;

    for (var i = 0; i < 4; i++) {
        if (chunks[i].indexOf('-') != -1) {
            var range = chunks[i].split('-');
            result *= parseInt(range[1]) -  parseInt(range[0]) + 1;
        }
    }

    return result;
}

alert(getNumAddresses(addr));
于 2012-05-02T16:45:54.633 に答える