当前位置: 代码迷 >> PHP >> IpToCidr函数,该如何解决
  详细解决方案

IpToCidr函数,该如何解决

热度:89   发布时间:2016-04-28 18:39:14.0
IpToCidr函数
function ip2cidr($ip_start,$ip_end) {
  if(long2ip(ip2long($ip_start))!=$ip_start or long2ip(ip2long($ip_end))!=$ip_end) return !trigger_error('ip 不合法', E_USER_NOTICE); 
  $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 = sprintf('%032b', $delta);
  if(ip2long($ip_start)==0 && substr_count($netmask,"1")==32) return "0.0.0.0/0";
  if($delta<0 or ($delta>0 && $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";


上面是版主大大给写的函数
ip2cidr("36.96.0.0","36.223.255.255")
执行结果36.96.0.0/9

反查
http://www.itmop.com/tool/ipaddress.php
36.96.0.0/9 -> 36.0.0.1 -36.127.255.254  与36.96.0.0 - 36.223.255.255 不一致

有个网站,但是无法看到转换代码
http://ip2cidr.com/
36.96.0.0-36.223.255.255
转化为36.96.0.0/11
36.128.0.0/10
36.192.0.0/11  

拆分区间不好掌握。。。
------解决方案--------------------
測試過沒有問題啊。
------解决方案--------------------
$r = ip2cidr("36.96.0.1","36.223.255.255");
print_r($r);

function ip2cidr($ip_start,$ip_end) {
  $res = array();
  if(long2ip(ip2long($ip_start))!=$ip_start or long2ip(ip2long($ip_end))!=$ip_end)
    return !trigger_error('ip 不合法', E_USER_NOTICE); 
  $ipl_start = ip2long($ip_start);
  if($ipl_start < 0) $ipl_start += 0x100000000;

  $ipl_end = ip2long($ip_end);
  if($ipl_end<0) $ipl_end += 0x100000000;

  $ipl=$ipl_start;
  do {
    $k = strrpos(sprintf('%032b', $ipl), '1');
    $cidr = $k + 1;
    $dk = pow(2, 32-$k-1);
    $mask = $dk - 1;
    $res[] = sprintf("%s/%d", long2ip($ipl & ~$mask), $cidr);
    $ipl += $dk;
  }while($ipl < $ipl_end);
  return $res;
Array
(
    [0] => 36.96.0.1/32
    [1] => 36.96.0.2/31
    [2] => 36.96.0.4/30
    [3] => 36.96.0.8/29
    [4] => 36.96.0.16/28
    [5] => 36.96.0.32/27
    [6] => 36.96.0.64/26
    [7] => 36.96.0.128/25
    [8] => 36.96.1.0/24
    [9] => 36.96.2.0/23
    [10] => 36.96.4.0/22
    [11] => 36.96.8.0/21
    [12] => 36.96.16.0/20
    [13] => 36.96.32.0/19
    [14] => 36.96.64.0/18
    [15] => 36.96.128.0/17
    [16] => 36.97.0.0/16
    [17] => 36.98.0.0/15
    [18] => 36.100.0.0/14
    [19] => 36.104.0.0/13
    [20] => 36.112.0.0/12
    [21] => 36.128.0.0/9
)


------解决方案--------------------
$r = ip2cidr("36.96.0.0","36.223.255.255");
print_r($r);

Array
(
    [0] => 36.96.0.0/11
    [1] => 36.128.0.0/9
)


你给的那个链接,最后一节的结果是错的
------解决方案--------------------
$r = ip2cidr("36.96.0.0","36.223.255.255");
print_r($r);

function ip2cidr($ip_start,$ip_end) {
  $res = array();
  if(long2ip(ip2long($ip_start))!=$ip_start or long2ip(ip2long($ip_end))!=$ip_end)
    return !trigger_error('ip 不合法', E_USER_NOTICE); 
  $ipl_start = ip2long($ip_start);
  if($ipl_start < 0) $ipl_start += 0x100000000;

  $ipl_end = ip2long($ip_end);
  相关解决方案