各位大神有没有生成多个cidr的函数 例如1.120.0.0 1.159.255.255 生成 1.120.0.0/13 1.128.0.0/11
回复讨论(解决方案) function ip2cidr($ip_start,$ip_end) {
if(long2ip(ip2long($ip_start))!=$ip_start or long2ip(ip2long($ip_end))!=$ip_end) return null;
$ipl_start=(int)ip2long($ip_start);
$ipl_end=(int)ip2long($ip_end);
if($ipl_start>0 && $ipl_end else $delta=$ipl_end-$ipl_start;
$netmask=str_pad(decbin($delta),32,0,str_pad_left);
if(ip2long($ip_start)==0 && substr_count($netmask,1)==32) return 0.0.0.0/0;
if($delta0 && $delta%2==0)) return null;
for($mask=0;$mask if(substr_count($netmask,0)!=$mask) return null;
return $ip_start/$mask;
} 这个函数不能生成多个cidr
echo ip2cidr('1.120.0.0', '1.127.255.255'); //1.120.0.0/13function ip2cidr($ip_start,$ip_end) { if(long2ip(ip2long($ip_start))!=$ip_start or long2ip(ip2long($ip_end))!=$ip_end) return null; $ipl_start = ip2long($ip_start); $ipl_end = ip2long($ip_end); if($ipl_start>0 && $ipl_end<0) $delta = ($ipl_end + 4294967296) - $ipl_start; else $delta = $ipl_end - $ipl_start; $netmask = str_pad(decbin($delta), 32, 0, str_pad_left); if(ip2long($ip_start)==0 && substr_count($netmask,1)==32) return 0.0.0.0/0; if($delta0 && $delta%2==0)) return null; for($mask=0; $mask0 && $ipl_end<0) $delta = ($ipl_end + 4294967296) - $ipl_start; else $delta = $ipl_end - $ipl_start; $netmask = str_pad(decbin($delta), 32, 0, str_pad_left); if(ip2long($ip_start)==0 && substr_count($netmask,1)==32) return 0.0.0.0/0; if($delta0 && $delta%2==0)) return null; for($mask=0; $mask0 && $ipl_end<0) $delta = ($ipl_end + 4294967296) - $ipl_start; else $delta = $ipl_end - $ipl_start; $netmask = sprintf('%032b', $delta); if(ip2long($ip_start)==0 && substr_count($netmask,1)==32) return 0.0.0.0/0; if($delta0 && $delta%2==0)) return !trigger_error(区间数量不合法 $delta, e_user_notice); for($mask=0; $mask<32; $mask++) if($netmask[$mask]==1) break; if(substr_count($netmask,0)!=$mask) { $w = strrpos($netmask, '0') + 1; $m = pow(2, 32-$w) - 1; $ip_start = long2ip(($ipl_start & ~$m)+$m+1); return long2ip($ipl_start & ~$m) . /$w, . ip2cidr($ip_start,$ip_end); }; return $ip_start/$mask;}
1.120.0.0/13,1.128.0.0/11
1.120.0.0/15,1.112.0.0/12,1.128.0.0/15,1.128.0.0/13,1.136.0.0/15,1.138.0.0/11
1.120.0.0/14,1.120.0.0/13,1.128.0.0/14,1.128.0.0/12,1.144.0.0/14,1.148.0.0/11
谢谢版主大人 尤其认识到自身不足 还要好好努力啊
