加载中…
个人资料
sjtuwangnan
sjtuwangnan
  • 博客等级:
  • 博客积分:0
  • 博客访问:0
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:大 中 小

用php进行ip/子网到IP 地址范围的转换

(2010-05-19 14:14:11)
标签:

php

程序

ip

掩码

ip范围转换

子网地址

it

分类: 技术

拿到一个电信网通路由的网段表,其中IP的显示形如:

27.8.0.0/13
27.36.0.0/14
27.40.0.0/13

....

 

由于设备只能用IP地址范围,而非/XX这样子网掩码的形式,因此必须将这些子网地址转换为IP网段范围的形式.

于是..祭出php,很快顺利解决..

 

程序思路:

0. 将字符串切分成两部分——IP 和 子网掩码(用explode()实现)

1. 转换/XX为xxx.xxx.xxx.xxx形式的子网掩码(用的笨方法,直接switch-case 一一对应即可)

2. 将ip和subnet mask做按位and操作,这样可以找到主机位全0的网络段地址(其实这部可以忽略,因为这些ip段给的非常标准,基本上都是网络段地址,无需转换)

3. 找到结束地址即广播地址(主机位为全1),方法是首先对subnet mask做非操作(1换0,0换1),然后做按位或的操作,即可将主机位全置1,获得结束地址

 

要对IP地址进行操作,先将其转为数字格式会比较好操作,好在php已经提供了函数调用

http://cn.php.net/manual/en/function.ip2long.php

http://cn.php.net/manual/en/function.long2ip.php

 

ip2long()
(PHP 4, PHP 5)
ip2long — Converts a string containing an (IPv4) Internet Protocol dotted address into a proper address

long2ip
(PHP 4, PHP 5)
long2ip — Converts an (IPv4) Internet network address into a string in Internet standard dotted format

考虑到用文件整行读取的方式操作比较方便,因此先将得到的网段文件存为txt格式.

下面是代码:

<html>
<body>
<?php

//打开文件
$handle = fopen("d:\\CNC.txt", "r");
if ($handle) {
    while (!feof($handle)) {
        $ip = fgets($handle);//用fgets直接一行一行的取
  $ip=trim($ip);//消除空格
  $ipaddr = explode("/", $ip);//将IP/网段切分开
  $ip=$ipaddr[0];
  $mask=$ipaddr[1];

//下面开始将数字掩码转为IP格式的掩码
  switch ($mask) {
   case "8":
    $mask=ip2long("255.0.0.0");
    $bcmask=~$mask;
    break;
   case "9":
    $mask=ip2long("255.128.0.0");
    $bcmask=~$mask;
    break;
   case "10":
    $mask=ip2long("255.192.0.0");
    $bcmask=~$mask;
    break;
   case "11":
    $mask=ip2long("255.224.0.0");
    $bcmask=~$mask;
    break;
   case "12":
    $mask=ip2long("255.240.0.0");
    $bcmask=~$mask;
    break;
   case "13":
    $mask=ip2long("255.248.0.0");
    $bcmask=~$mask;
    break;
   case "14":
    $mask=ip2long("255.252.0.0");
    $bcmask=~$mask;
    break;
   case "15":
    $mask=ip2long("255.254.0.0");
    $bcmask=~$mask;
    break;
   case "16":
    $mask=ip2long("255.255.0.0");
    $bcmask=~$mask;
    break;
   case "17":
    $mask=ip2long("255.255.128.0");
    $bcmask=~$mask;
    break;
   case "18":
    $mask=ip2long("255.255.192.0");
    $bcmask=~$mask;
    break;
   case "19":
    $mask=ip2long("255.255.224.0");
    $bcmask=~$mask;
    break;
   case "20":
    $mask=ip2long("255.255.240.0");
    $bcmask=~$mask;
    break;
   case "21":
    $mask=ip2long("255.255.248.0");
    $bcmask=~$mask;
    break;
   case "22":
    $mask=ip2long("255.255.252.0");
    $bcmask=~$mask;
    break;
   case "23":
    $mask=ip2long("255.255.254.0");
    $bcmask=~$mask;
    break;
   case "24":
    $mask=ip2long("255.255.255.0");
    $bcmask=~$mask;
    break;
   case "25":
    $mask=ip2long("255.255.255.128");
    $bcmask=~$mask;
    break;
   case "26":
    $mask=ip2long("255.255.255.192");
    $bcmask=~$mask;
     break;
   default:
    break;
  }
  $ip=ip2long($ip);//IP转为long类型
  $newip=$ip & $mask; //得到网段地址
  $newipshow=long2ip($newip);//转换回到ip地址格式

//下面一段主要是将ip范围进行合并,从subnet改为范围后,你会发现有一些连续的IP段可以进行合并
  if ($broadcastip==0)
   echo "\"".$newipshow."\",";
  else if ($newip!=$broadcastip+1){
   echo "\"".$broadcastipshow."\"";
   echo "<br />";
   echo "\"".$newipshow."\",";
  }
  else if ($newip==$broadcastip+1)
  {
   echo ",";
  }

  $broadcastip=$ip | $bcmask;
  $broadcastipshow=long2ip($broadcastip);
   }
 echo $broadcastipshow;
    fclose($handle);
}
?>
</body>
</html>

 

转换完成后,看到的网段转换成功,变成

"58.30.0.0","58.63.255.255"
"58.66.0.0","58.67.255.255"
"58.82.0.0","58.82.127.255"
"58.83.0.0","58.83.255.255"

 

0

阅读┊ 收藏 ┊ 喜欢▼ ┊打印┊举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有