如何在Javascript中检测给定IP是否在给定子网中?

时间:2008-12-31 05:06:02

标签: javascript networking tcp ip

我想在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 个答案:

答案 0 :(得分:4)

Pseudocode,以dustin的答案为基础:

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 :(得分:1)

继续学习吧。 :)

诀窍是将“1.2.3.4”解析为单个整数((1 <&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&gt;&lt;&lt;&gt;&gt;&gt;&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&gt; 1.2.0.0'作为整数(16908288),然后将掩码作为整数(16位== 4294901760)的msb的1位数,然后将掩码按位并应用于原始地址((16909060&amp; 4294901760)== 16908288)如果屏蔽地址==网络地址,那么它就在网络中。

答案 2 :(得分: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位。

相关问题