用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 );
其子网掩码根据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 );
相关文章推荐
- php求一个网段开始与结束IP地址的方法
- php求一个网段开始与结束IP地址的方法
- PHP程序的开始与结束
- 分享一个PHP抽奖算法程序代码
- 使用php根据起始ip地址和掩码 计算广播地址(网段结束地址)
- 程序人生 - 结束,是另外一个阶段的开始
- php 读取一个文档的任意开始行数与结束行数
- 程序人生 - 结束,是另外一个阶段的开始
- 从头开始学习JSP(1)采用MyEclipse和Tomcat运行一个简单的.jsp程序
- 通过Z-BlogPHP程序快速在论坛里搭建一个博客页面
- PHP获取指定月份的第一天开始和最后一天结束的时间戳函数
- php根据开始日期和结束日期得到时间数组
- PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍
- 一个MapReuce作业的从开始到结束--第6章Hadoop以Jar包的方式执行MapReduce任务
- 试设计一个算法,删除一个顺序表从第i个元素开始的k个元素
- PHP内核探索:一次请求的开始与结束
- Cocos2d-x 程序是如何开始运行与结束的
- 简化以下程序,将函数对象 divide_by 转换为一个函数,并将 for 循环替换为用一个标准的 C++ 算法来输出数据
- 如何调用一个程序,等待运行结束,并知晓程序运行成功与否:ShellExecuteEx;WaitForSingleObject;GetExitCodeProcess(C代码)
- php 获取本周的开始时间和结束时间