拿到一个电信网通路由的网段表,其中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已经提供了函数调用
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格式.
下面是代码:
//打开文件
$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":