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

伪代码,以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('.') 来获取四个八位字节并轻松地将它们转换为整数。

于 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 回答