从 PHP 中的 CIDR 表示法获取列表 IP

2022-08-30 19:31:56

有没有办法(或函数/类)从 CIDR 表示法中获取 IP 地址列表?

例如,我有73.35.143.32 / 27 CIDR,并希望在此表示法中获取所有IP的列表。有什么建议吗?

谢谢。


答案 1

我将编辑上述以包含该方法的方法。以下是我想出的代码,在那之前可能会对您有所帮助。

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 范围的低端作为数组中的第一个条目,然后返回高端作为第二个条目。


答案 2

好吧,这是一个位掩码 - 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。


推荐