我想在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
我应该从头开始编写,还是可以使用一些好的库?或者整个功能是否已经编写并在公共领域?
答案 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位。