从 PHP 中的 CIDR 表示法获取列表 IP
有没有办法(或函数/类)从 CIDR 表示法中获取 IP 地址列表?
例如,我有73.35.143.32 / 27 CIDR,并希望在此表示法中获取所有IP的列表。有什么建议吗?
谢谢。
有没有办法(或函数/类)从 CIDR 表示法中获取 IP 地址列表?
例如,我有73.35.143.32 / 27 CIDR,并希望在此表示法中获取所有IP的列表。有什么建议吗?
谢谢。
我将编辑上述类以包含该方法的方法。以下是我想出的代码,在那之前可能会对您有所帮助。
function cidrToRange($cidr) {
$range = array();
$cidr = explode('/', $cidr);
$range[0] = long2ip((ip2long($cidr[0])) & ((-1 << (32 - (int)$cidr[1]))));
$range[1] = long2ip((ip2long($range[0])) + pow(2, (32 - (int)$cidr[1])) - 1);
return $range;
}
var_dump(cidrToRange("73.35.143.32/27"));
//////////////////OUTPUT////////////////////////
// array(2) {
// [0]=>
// string(12) "73.35.143.32"
// [1]=>
// string(12) "73.35.143.63"
// }
/////////////////////////////////////////////////
返回 ip 范围的低端作为数组中的第一个条目,然后返回高端作为第二个条目。
好吧,这是一个位掩码 - 73.35.143.32/27意味着27位是网络掩码,其余的可用于分配给网络中的节点:
73.35.143.32
在二进制中是这样的(为了便于阅读而显示的点):
01001001.00100011.10001111.00100000
网络掩码为 27 位:
11111111.11111111.11111111.11100000
所以你可以把它们放在一起,得到这个:
01001001.00100011.10001111.001 00000
network prefix (27 bits) | node address (5 bits)
从这里,您只需枚举节点地址中的所有组合(00000 为 0,11111 为 31,因此一个简单的循环就足够了),您将拥有所有可用的主机。
将此伪代码转换为PHP留给读者练习;)
哦,还有强制性的弃用警告:IPv4现在已经满了,还要考虑IPv6。