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


Posted in PHP onJuly 09, 2015

本文实例讲述了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 相关文章推荐
Smarty模板快速入门
Jan 04 PHP
队列在编程中的实际应用(php)
Sep 04 PHP
实现PHP多线程异步请求的3种方法
Jan 17 PHP
php使用Imagick生成图片的方法
Jul 31 PHP
WordPress中注册菜单与调用菜单的方法详解
Dec 18 PHP
zen_cart实现支付前生成订单的方法
May 06 PHP
Yii2主题(Theme)用法详解
Jul 23 PHP
thinkphp3.2.0 setInc方法 源码全面解析
Jan 29 PHP
PHP实现负载均衡的加权轮询方法分析
Aug 22 PHP
浅析php如何实现爬取数据原理
Sep 27 PHP
详解在YII2框架中使用UEditor编辑器发布文章
Nov 02 PHP
PHP实用小技巧之调用录像的方法
Dec 05 PHP
PHP实现全角字符转为半角方法汇总
Jul 09 #PHP
php将金额数字转化为中文大写
Jul 09 #PHP
php实现的简易扫雷游戏实例
Jul 09 #PHP
php链表用法实例分析
Jul 09 #PHP
php结合curl实现多线程抓取
Jul 09 #PHP
php基本函数汇总
Jul 09 #PHP
php+curl 发送图片处理代码分享
Jul 09 #PHP
You might like
《魔兽争霸3》重制版究竟重制了什么?玩家:这么糊弄真的好吗?
2020/05/04 魔兽争霸
PHP 错误之引号中使用变量
2009/05/04 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
javascript设置页面背景色及背景图片的方法
2015/12/29 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
React组件生命周期详解
2017/07/03 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
Python实现批量压缩图片
2018/01/25 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
python 日期操作类代码
2018/05/05 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
python logging模块的使用总结
2019/07/09 Python
numpy.array 操作使用简单总结
2019/11/08 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
20行代码教你用python给证件照换底色的方法示例
2021/02/05 Python
新媒传信软件测试面试题
2013/02/24 面试题
会计专业的自荐信
2013/12/12 职场文书
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
知识竞赛活动方案
2014/02/18 职场文书
道德之星事迹材料
2014/05/03 职场文书
房地产营销活动策划方案
2014/09/15 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
留学推荐信中文范文
2015/03/26 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书