3

次の行に沿って Javascript で関数を書きたいと思います。

in_subnet(ip, network, slash) {
    ...
}

in_subnet('1.2.3.4', '1.2.0.0', 16) # True, since it's in 1.2.0.0/16
in_subnet('1.2.3.4', '1.2.0.0', 24) # False, since it's not in 1.2.0.0/24

ゼロから作成する必要がありますか、それとも使用できる優れたライブラリがいくつかありますか? それとも、関数全体が既に作成されており、パブリック ドメインになっていますか?

4

3 に答える 3

4

ダスティンの答えに基づいた疑似コード:

addr_one = ip_addr_to_integer(ip);
addr_two = ip_addr_to_integer(network);
mask = ((1 << (32-slash)) - 1) ^ 0xFFFFFFFF;
return (((addr_one ^ addr_two) & mask) == 0);

IP アドレス文字列が有効であることがわかっている場合は、おそらく string.split('.') を使用して 4 つのオクテットを取得し、簡単に整数に変換できます。

于 2008-12-31T05:29:05.267 に答える
1

先に進み、それを学びましょう。:)

トリックは、「1.2.3.4」を単一の整数 ((1 << 24 | 2 << 16 | 3 << 8 | 4) == 16909060) に解析し、次に「1.2.0.0」を整数 (16908288) として解析することです。 ) 次に、整数としての msb からの 1 ビットの数としてマスク (16 ビット == 4294901760) をマスクし、マスクをビット単位で元のアドレス ((16909060 & 4294901760) == 16908288) に適用します。 == ネットワークアドレス、それからそれはネットワークにあります。

于 2008-12-31T05:17:40.390 に答える
0
addr_one = ip_addr_to_integer(ip >> (32 - slash));
addr_two = ip_addr_to_integer(network >> (32 - slash));
return (addr_one == addr_two);

ビット演算子は 32 ビットで機能しなくなります。

于 2016-07-18T21:02:32.023 に答える