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 相关文章推荐
木翼下载系统中说明的PHP安全配置方法
Jun 16 PHP
php 什么是PEAR?
Mar 19 PHP
php 传值赋值与引用赋值的区别
Dec 29 PHP
php设计模式 Composite (组合模式)
Jun 26 PHP
PHP中最容易忘记的一些知识点总结
Apr 28 PHP
PHP函数microtime()用法与说明
Dec 04 PHP
PHP中echo和print的区别
Aug 28 PHP
php编程实现简单的网页版计算器功能示例
Apr 26 PHP
PHP依赖注入原理与用法分析
Aug 21 PHP
PHP抽象类与接口的区别详解
Mar 21 PHP
浅谈laravel orm 中的一对多关系 hasMany
Oct 21 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 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
中英文字符串翻转函数
2008/12/09 PHP
PHP函数getenv简介和使用实例
2014/05/12 PHP
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
PHP实现对二维数组某个键排序的方法
2016/09/14 PHP
php 从一个数组中随机的取出若干个不同的数实例
2016/12/31 PHP
LAMP环境使用Composer安装Laravel的方法
2017/03/25 PHP
PHP封装curl的调用接口及常用函数详解
2018/05/31 PHP
作为PHP程序员你要知道的另外一种日志
2018/07/30 PHP
javascript 实用的文字链提示框效果
2010/06/30 Javascript
容易被忽略的JS脚本特性
2011/09/13 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
javaScript给元素添加多个class的简单实现
2016/07/20 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
jQuery实现的网页换肤效果示例
2016/09/20 Javascript
vue router2.0二级路由的简单使用
2017/07/05 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
vue-router 源码之实现一个简单的 vue-router
2018/07/02 Javascript
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
从零学Python之引用和类属性的初步理解
2014/05/15 Python
Python lambda和Python def区别分析
2014/11/30 Python
python用来获得图片exif信息的库实例分析
2015/03/16 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
python实现Adapter模式实例代码
2018/02/09 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
opencv与numpy的图像基本操作
2019/03/08 Python
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
一套Java笔试题
2016/08/20 面试题
公司离职证明范本
2014/01/13 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
酒店温馨提示语
2015/07/14 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python
 Python 中 logging 模块使用详情
2022/03/03 Python
Go语言编译原理之变量捕获
2022/08/05 Golang