php求一个网段开始与结束IP地址的方法

 更新时间:2015年07月09日 12:23:09   作者:kevin0216  
这篇文章主要介绍了php求一个网段开始与结束IP地址的方法,涉及php字符串操作与进制转换的相关技巧,需要的朋友可以参考下

本文实例讲述了php求一个网段开始与结束IP地址的方法。分享给大家供大家参考。具体如下:

比如:网段(192168.1.5/24),其子网掩码根据24划分为:
11111111.11111111.11111111.00000000(255.255.255.0)
说明:IP地址为32bits,24在划分网段中就表示前面有24个1,后面有8个0.
开始IP地址的算法是:192.168.1.5的二进制与子网掩码的二进制进行“与”运算出来的。
结束IP地址的算法是:子网掩码的二进制先取反,然后和192.168.1.5的二进制进行“或”运算
实际的就应用中,那样得出的是网络地址和广播地址,网络地址+1才是第一个主机地址,广播地址-1为最后一个主机地址。

<?php
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 startIp($str,$bSub)
{
  $bIp = decbin($str);
  $bIp = str_pad($bIp,8,"0",STR_PAD_LEFT);
  $sIp = bindec($bIp & $bSub);
  return $sIp;
}
function endIp($str,$bSub)
{
  $bIp = decbin($str);
  $bIp = str_pad($bIp,8,"0",STR_PAD_LEFT);
  $eIp = bindec($bIp | revBin($bSub));
  return $eIp;
}
$ip = array('192','168','1','5');//设定IP地址,可以从表单获取,这里只作演示
$mask = '24';          //设置掩码
$bSub = mask2bin($mask);     //将子网掩码转换二进制
$mask = array();
$mask[] = substr($bSub,"0",8);  //将子网掩码每8位分一段
$mask[] = substr($bSub,"8",8);
$mask[] = substr($bSub,"16",8);
$mask[] = substr($bSub,"24",8);
echo '<table summary="result" border="1" cellspacing="1" cellpadding="0" >
 <tbody>
  <td align="right" ><font size="2">掩码:</font></td>
  <td>
  <font size="2">';
for ($i=0;$i<4;$i++)
{
  echo bindec($mask[$i]);
  if($i!=3)
  echo ".";
}
echo '</font>
  </td>
  </tr>
 <tr>
  <td align="right"><font size="2">网络地址:</font></td>
  <td>
  <font size="2">';
  for ($i=0;$i<4;$i++)
  {
   echo startIp($ip[$i],$mask[$i]);
   if($i!=3)
   echo ".";
  }
echo '</font> 
  </td>
  </tr>
    </td>
  </tr>
 <tr>
  <td align="right"><font size="2">第一个可用:</font></td>
  <td>
  <font size="2">';
  for ($i=0;$i<3;$i++)
  {   
   echo startIp($ip[$i],$mask[$i]);  
   echo ".";
  }
  $ip_4 = startIp($ip[3],$mask[3]);
  echo ++$ip_4;
  echo '</font> 
  </td>
  </tr>
 <tr>
  <td align="right"><font size="2">最后可用:</font></td>
  <td>
  <font size="2">';
  for ($i=0;$i<3;$i++)
  {
   echo endIp($ip[$i],$mask[$i]);
   echo ".";
  }
  $ip_4 = endIp($ip[3],$mask[3]);
  echo --$ip_4;
echo '
  </font>
  </td>
  </tr>
 <tr>
  <td align="right"><font size="2">广播地址:</font></td>
  <td>
  <font size="2">';
  for ($i=0;$i<4;$i++)
  {
   echo endIp($ip[$i],$mask[$i]);
   if($i!=3)
   echo ".";
  }
?>

希望本文所述对大家的php程序设计有所帮助。

相关文章

  • PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】

    PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】

    这篇文章主要介绍了PHP的图像处理,结合实例形式总结分析了PHP针对文字水印、图片水印、压缩图像等相关操作实现技巧,需要的朋友可以参考下
    2019-12-12
  • php接口与接口引用的深入解析

    php接口与接口引用的深入解析

    以下是对php中的接口与接口引用进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • PHP empty函数报错解决办法

    PHP empty函数报错解决办法

    这篇文章主要介绍了PHP empty函数在检测一个非变量情况下报错的解决办法,需要的朋友可以参考下
    2014-03-03
  • 使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)

    使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)

    我们今天为大家介绍的PHP连接数据库的方法包括在MYSQL数据库、ACCESS数据库、MS SQL数据库和Oracle数据库中实现
    2016-12-12
  • 获取远程文件大小的php函数

    获取远程文件大小的php函数

    用php实现获取远程文件大小的代码,需要的朋友可以参考下。
    2010-01-01
  • PHP array操作10个小技巧分享

    PHP array操作10个小技巧分享

    其实任何一门计算机语言中对array(数组)的操作都是一门学问,PHP也不例外。下面笔者想向各位介绍关于PHP中array操作的10个小技巧及相关的函数。
    2011-06-06
  • PHP 7.1新特性的汇总介绍

    PHP 7.1新特性的汇总介绍

    大家都知道PHP 7.1 release版本发布在即,所以这篇文章就给大家整理一下7.1中的一些新特性以供了解。所有内容均选自官方 RFC 文档。有需要的朋友们可以参考借鉴,下面来跟着小编一起学习学习吧。
    2016-12-12
  • 浅谈PHP安全防护之Web攻击

    浅谈PHP安全防护之Web攻击

    常见的Web攻击分为两类:一是利用Web服务器的漏洞进行攻击,如CGI缓冲区溢出,目录遍历漏洞利用等攻击;二是利用网页自身的安全漏洞进行攻击,如SQL注入,跨站脚本攻击等。下面这篇文章主要介绍了PHP安全防护之Web攻击,需要的朋友可以参考,下面来一起看看吧。
    2017-01-01
  • php获取mysql数据库中的所有表名的代码

    php获取mysql数据库中的所有表名的代码

    如何用PHP获取MYSQL数据库的所有表名?记得在mysql命令行下面有条命令SHOW TABLES是显示mysql数据库里面所有数据表的,那么就用这条命令来遍历数据表名吧
    2011-04-04
  • PHP实现的MD5结合RSA签名算法实例

    PHP实现的MD5结合RSA签名算法实例

    这篇文章主要介绍了PHP实现的MD5结合RSA签名算法,结合实例形式分析了php使用md5结合RSA实现的签名算法相关操作技巧,并附带了RSA公钥与私钥的相关说明,需要的朋友可以参考下
    2017-10-10

最新评论