Как определить, находится ли данный IP в данной подсети в Javascript? - PullRequest
3 голосов
/ 31 декабря 2008

Я хотел бы написать функцию в 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

Должен ли я написать это с нуля, или есть какие-нибудь хорошие библиотеки, которые я мог бы использовать? Или вся функция уже написана и находится в свободном доступе?

Ответы [ 3 ]

4 голосов
/ 31 декабря 2008

Псевдокод, основанный на ответе Душина:

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 ('.'), Чтобы получить четыре октета и легко преобразовать их в целое число.

1 голос
/ 31 декабря 2008

Идите и изучите это. :)

Хитрость заключается в том, чтобы разобрать '1.2.3.4' в одно целое число ((1 << 24 | 2 << 16 | 3 << 8 | 4) == 16909060), а затем «1.2.0.0» как целое число (16908288), а затем маска как число 1 бит из msb в виде целого числа (16 бит == 4294901760), а затем применить маску с побитовым и исходным адресом ((16909060 & 4294901760) == 16908288) замаскированный адрес == сетевой адрес, то он находится в сети. </p>

0 голосов
/ 19 июля 2016
addr_one = ip_addr_to_integer(ip >> (32 - slash));
addr_two = ip_addr_to_integer(network >> (32 - slash));
return (addr_one == addr_two);

Битовые операторы перестают работать с 32 битами.

...