返回列表 回复 发帖

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

用PHP程序写一个算法:求一个网段的开始,结束IP地址!!!
比如网段(192.168.1.5/20),其子网掩码根据20划分为:
  1. 1111111.11111111.11110000.00000000(255.255.240.0)
复制代码
说明:IP地址为32bits,20在划分网段中就表示前面有20个1,后面有12个0。
开始IP地址的算法是:192.168.1.5的二进制与子网掩码的二进制进行“与”运算出来的,也就是如下:
  1. IP:                     11000000.10101000.0000   0001.00000101(192.168.1.5)
  2. SUBMASK:             11111111.11111111.1111   0000.00000000(255.255.240.0)
复制代码
它的起始IP是:
  1. 11000000.10101000.0000   0000.00000000(192.168.0.0)
复制代码
结束IP地址的算法是:子网掩码的二进制先取反,然后和192.168.1.5的二进制进行“或”运算,例子如下:
  1. SUBMASK:             11111111.11111111.1111   0000.00000000(255.255.240.0)
  2. 取反:                 00000000.00000000.0000.1111.11111111
  3. IP:                     11000000.10101000.0000   0001.00000101(192.168.1.5)
复制代码
它的终止IP是:
  1. 11000000.10101000.0000   1111.11111111(192.168.15.255)
复制代码
请问如何将用代码实现上述算法!!!
窗内网汇智科技旗下在线教育平台
这问题确实有点难,不过实际应用性很强啊,呵呵。我整理了一下,给你一个示例吧,应该对你很有帮助:
  1. <?php
  2. function mask2bin( $n ) {
  3. $n = intval($n);
  4. if ( $n < 0 || $n > 32 ) die( 'error submask ');
  5. return str_repeat( "1 ", $n).str_repeat( "0 ",32-$n);
  6. }
  7. function revBin( $s ) {
  8. $p = array( '0 ', '1 ', '2 ' );
  9. $r = array( '2 ', '0 ', '1 ' );
  10. return str_replace( $p, $r, $s );
  11. }
  12. function execIp( $str ) {
  13. list($ip, $m) = explode( "/ ", $str);
  14. $bIp = decbin( ip2long($ip) );
  15. $bSub = mask2bin(20);
  16. $sIp = $bIp & $bSub;
  17. $eIp = $bIp | revBin($bSub);
  18. print " ip : ".$sIp. " - ".$eIp;
  19. }
  20. $str = "192.168.1.5/20 ";
  21. execIp( $str );
  22. ?>
复制代码
输出结果是:
  1. ip : 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
复制代码
窗内网汇智科技旗下在线教育平台
返回列表