您的位置:首页 > 编程语言 > PHP开发

用PHP程序写一个算法:求一个网段的开始,结束IP地址

2011-05-12 16:09 351 查看
比如网段(192.168.1.5/20):
其子网掩码根据20划分为:1111111.11111111.11110000.00000000(255.255.240.0)
说明:IP地址为32bits,20在划分网段中就表示前面有20个1,后面有12个0.

开始IP地址的算法是:
192.168.1.5的2进制与子网掩码的2进制进行”与“运算出来的;
也就是如下:
IP: 11000000.10101000.0000 0001.00000101(192.168.1.5)
SUBMASK: 11111111.11111111.1111 0000.00000000(255.255.240.0)

它的起始IP是:11000000.10101000.0000 0000.00000000(192.168.0.0)

结束IP地址的算法是:子网掩码的2进制先取反,然后和192.168.1.5的2进制进行“或”运算,例子如下:
SUBMASK: 11111111.11111111.1111 0000.00000000(255.255.240.0)
取反: 00000000.00000000.0000.1111.11111111
IP: 11000000.10101000.0000 0001.00000101(192.168.1.5)

它的终止IP是:11000000.10101000.0000 1111.11111111(192.168.15.255)

请问如何将用代码实现上述算法

function mask2bin( $n ) {
$n = intval($n);
if ( $n < 0 || $n > 32 ) die( 'error submask ');
return str_repeat( "1 ", $n).str_repeat( "0 ",32-$n);
}

function revBin( $s ) {
$p = array( '0 ', '1 ', '2 ' );
$r = array( '2 ', '0 ', '1 ' );
return str_replace( $p, $r, $s );
}

function execIp( $str ) {
list($ip, $m) = explode( "/ ", $str);
$bIp = decbin( ip2long($ip) );
$bSub = mask2bin(20);
$sIp = $bIp & $bSub;
$eIp = $bIp | revBin($bSub);
print " ip : ".$sIp. " - ".$eIp;
}

$str = "192.168.1.5/20 ";
execIp( $str );
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: