以下方法实现判断一个IP是否被一个IP区间所包含

有一些静态方法可能引用了同名空间的自定义的类,

至于合并两个相临的IP段,可对其中的最大或最小IP+1

using System;
using System.Text.RegularExpressions;

namespace HKH.Common
{
 /// <summary>
 /// clsMacAndIP 的摘要说明。
 /// </summary>
 public class clsIPAddress
 {
  private clsIPAddress()
  {
  }

#region 判断是否合法 IP

/// <summary>
  /// 判断是否合法 IP
  /// </summary>
  /// <param name="strIP"></param>
  /// <returns></returns>
  public static bool ValidateIPAddress(string strIP)
  {
   if ( null == strIP || "" == strIP.Trim() || Convert.IsDBNull(strIP) )
    return false;

return Regex.IsMatch(strIP,@"^((/d{1,2}|1/d/d|2[0-4]/d|25[0-5])/.){3}(/d{1,2}|1/d/d|2[0-4]/d|25[0-5])$");
  }

#endregion

#region 转换成数值

/// <summary>
  ///  转换为数值
  /// </summary>
  /// <param name="IPAddr"></param>
  /// <returns></returns>
  public static uint TransNum(string IPAddr)
  {
   if ( !ValidateIPAddress(IPAddr) )
    throw new Exception("IP Address isn't Well Format!");

string[] IPStrArray = new string[4];
   IPStrArray = IPAddr.Split('.');
   return MAKELONG(MAKEWORD(byte.Parse(IPStrArray[3]),byte.Parse(IPStrArray[2])),MAKEWORD(byte.Parse(IPStrArray[1]),byte.Parse(IPStrArray[0])));
  }

#endregion

#region 格式化

/// <summary>
  /// 格式化
  /// </summary>
  /// <param name="IPAddr"></param>
  /// <returns></returns>
  public static string Format(string IPAddr)
  {
   if (IPAddr[0] == '.')
    IPAddr = "0" + IPAddr;

if (IPAddr[IPAddr.Length - 1] == '.')
    IPAddr += "0.0.0.";
   else
    IPAddr += ".0.0.0.";

IPAddr = IPAddr.Substring(0,clsString.IndexOf(IPAddr,".",4));

//   //去掉无用的0
//   IPAddr = Regex.Replace(IPAddr,"^0{1,2}","");
//   IPAddr = Regex.Replace(IPAddr,@"/.+0{1,2}",".");

if ( ValidateIPAddress(IPAddr) )
    return IPAddr;

return "0.0.0.0";
  }

#endregion

#region 比较两个IP的大小

/// <summary>
  /// 比较两个IP的大小
  /// </summary>
  /// <param name="IP1"></param>
  /// <param name="IP2"></param>
  /// <returns></returns>
  public static int Compare(string IP1,string IP2)
  {
   if ( !(ValidateIPAddress(IP1) && ValidateIPAddress(IP2)))
    throw new Exception("IP Address isn't Well Format!");

uint IPNum1 = TransNum(IP1);
   uint IPNum2 = TransNum(IP2);

if (IPNum1 == IPNum2 )
    return 0;

return IPNum1 > IPNum2 ? 1 : -1 ;
  }

#endregion

#region 判断一个IP是否包含在指定IP区间内

/// <summary>
  /// 判断一个IP是否包含在指定IP区间内
  /// </summary>
  /// <param name="IPRegion"></param>
  /// <param name="IP"></param>
  /// <returns></returns>
  public static bool IsInclude(string[] IPRegion,string IP)
  {
   //验证
   if ( null == IPRegion || null == IP || 0 == IPRegion.Length )
    return false;

if ( !ValidateIPAddress(IP) )
    return false;

if ( 1 == IPRegion.Length )
   {
    if ( !ValidateIPAddress(IPRegion[0]) )
     return false;
    
    if ( 0 == Compare(IPRegion[0],IP) )
     return true;
   }

if ( !(ValidateIPAddress(IPRegion[0]) && ValidateIPAddress(IPRegion[1])) )
    return false;

uint IPNum = TransNum(IP);
   uint IPNum1 = TransNum(IPRegion[0]);
   uint IPNum2 = TransNum(IPRegion[1]);

//比较
   if ( Math.Min(IPNum1,IPNum2) <= IPNum && Math.Max(IPNum1,IPNum2) >= IPNum )
    return true;
   
   return false;
  }

#endregion

#region 判断两个IP区间是否重叠,重叠则返回合并区间,否则返回 NULL

/// <summary>
  /// 判断两个IP区间是否重叠,重叠则返回合并区间,否则返回 NULL
  /// </summary>
  /// <param name="IPRegion1"></param>
  /// <param name="IPRegion2"></param>
  /// <returns></returns>
  public static string[] CheckOverlapAndMerge(string[] IPRegion1,string[] IPRegion2)
  {
   //验证
   if ( null == IPRegion1 || null == IPRegion2 || 0 == IPRegion1.Length || 0 == IPRegion2.Length )
    return null;

//分数组长度进行处理 =1 和 > 1
   if ( 1 == IPRegion1.Length )
   {
    if (!ValidateIPAddress(IPRegion1[0]))
     throw new Exception("IP Address isn't Well Format!");

if ( 1 == IPRegion2.Length )
    {
     if (!ValidateIPAddress(IPRegion2[0]))
      throw new Exception("IP Address isn't Well Format!");
     
     //相等
     if ( Equals(IPRegion1[0],IPRegion2[0]) )
      return IPRegion1;
    }
    // > 1
    else
    {
     if ( !(ValidateIPAddress(IPRegion2[0]) && ValidateIPAddress(IPRegion2[1])) )
      throw new Exception("IP Address isn't Well Format!");
     
     if ( IsInclude(IPRegion2,IPRegion1[0]) )
      return IPRegion2;
    }
   }
   // >1
   else
   {
    if ( !(ValidateIPAddress(IPRegion1[0]) && ValidateIPAddress(IPRegion1[1])) )
     throw new Exception("IP Address isn't Well Format!");

if ( 1 == IPRegion2.Length )
    {
     if (!ValidateIPAddress(IPRegion2[0]))
      throw new Exception("IP Address isn't Well Format!");
     
     if ( IsInclude(IPRegion1,IPRegion2[0]) )
      return IPRegion1;
    }
    // > 1
    else
    {
     if ( !(ValidateIPAddress(IPRegion2[0]) && ValidateIPAddress(IPRegion2[1])) )
      throw new Exception("IP Address isn't Well Format!");
     
     uint IPNum1_1 = TransNum(IPRegion1[0]);
     uint IPNum1_2 = TransNum(IPRegion1[1]);
     uint IPNum2_1 = TransNum(IPRegion2[0]);
     uint IPNum2_2 = TransNum(IPRegion2[1]);
     
     #region 大小格式整理 IP[0] <= IP[1]

if ( IPNum1_1 > IPNum1_2 )
     {
      string stemp = IPRegion1[0];
      IPRegion1[0] = IPRegion1[1];
      IPRegion1[1] = stemp;

uint utemp = IPNum1_1;
      IPNum1_1 = IPNum1_2;
      IPNum1_2 = utemp;
     }

if ( IPNum2_1 > IPNum2_2 )
     {
      string stemp = IPRegion2[0];
      IPRegion2[0] = IPRegion2[1];
      IPRegion2[1] = stemp;

uint utemp = IPNum2_1;
      IPNum2_1 = IPNum2_2;
      IPNum2_2 = utemp;
     }

#endregion

#region 判断合并

//互不包含
     if ( IPNum1_1 > IPNum2_2 || IPNum1_2 < IPNum2_1 )
      return null;

//合并
     string[] result = new string[2];

result[0] = IPNum1_1 < IPNum2_1 ? IPRegion1[0] : IPRegion2[0] ;
     result[1] = IPNum1_2 > IPNum2_2 ? IPRegion1[1] : IPRegion2[1] ;

return result;

#endregion
    }

}

return null;
  }

#endregion

#region 私有方法

/// <summary>
  /// 移位转换_8
  /// </summary>
  /// <param name="bLow"></param>
  /// <param name="bHigh"></param>
  /// <returns></returns>
  private static ushort MAKEWORD(byte bLow,byte bHigh)
  {
   return ((ushort) (((byte) (bLow)) | ((ushort) ((byte) (bHigh))) << 8));
  }

/// <summary>
  /// 移位转换_16
  /// </summary>
  /// <param name="bLow"></param>
  /// <param name="bHigh"></param>
  /// <returns></returns>
  private static uint MAKELONG(ushort bLow,ushort bHigh)
  {
   return ((uint) (((ushort) (bLow)) | ((uint) ((ushort) (bHigh))) << 16));
  }
  
  #endregion
 }
}

判断一个IP区间(或IP)是否被另一个IP区间所包含相关推荐

  1. golang中获取公网ip、查看内网ip、检测ip类型、校验ip区间、ip地址string和int转换、根据ip判断地区国家运营商等

    作者: 一蓑烟雨1989 所属专栏: Go从不放弃到实战 本文链接:https://blog.csdn.net/wangshubo1989/article/details/78066344 生命不止, ...

  2. 一个3200位长的tcp报文传到ip层_运输层

    进程之间的通信 运输层的两个主要协议 运输层的主要功能 运输层的端口 TCP的端口 UDP的主要特点 TCP主要特点 套接字 可靠通信的实现 停止等待协议 信道利用率 连续ARQ协议 TCP可靠通信的 ...

  3. python判断ip地址是否合法_Python课堂:判定IP地址合法性的三种方法

    IP IP合法性校验是开发中非常常用的,看起来很简单的判断,作用确很大,写起来比较容易出错,今天我们来总结一下,看一下3种常用的IP地址合法性校验的方法. IPv4的ip地址格式:(1~255).(0 ...

  4. 22.1 网络编程:软件结构、网络通信协议、UDP与TCP协议、(网络编程三要素:协议、ip地址、端口号)、查看ip地址、检测网络是否连通、判断ip是否可用

    目录 网络编程 软件结构 网络通信协议 TCP/IP协议 协议分类 UDP TCP 网络编程三要素 协议 IP地址 列:查看本机ip地址 检查网络是否连通.判断ip是否可用 端口号 网络编程 软件结构 ...

  5. 两台服务器虚拟成一个ip地址,两台服务器如何用一个ip地址

    两台服务器如何用一个ip地址 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. 检 ...

  6. ping不通自己的ip地址_如何批量Ping N个IP地址,掌握一个命令让你节省N小时,让老板给你加鸡腿!...

    这是一个信息爆炸的时代,过多无用的信息.公众号只会让我们视觉疲劳.基于这个原因,本公众号致力于为广大网工分享知识.分享招聘信息.传播有价值的信息,运行4年多以来,已慢慢成为网工圈最受信赖的公众号.了解 ...

  7. nginx php多域名配置文件,配置文件,nginx_nginx多站点配置,无法通过域名访问,使用ip访问会跳转到其中一个站点,配置文件,nginx - phpStudy...

    nginx多站点配置,无法通过域名访问,使用ip访问会跳转到其中一个站点 在一台服务器设置了Nginx多站点,但是访问这些站点的域名均无法访问,错误如下图: 通过ip会跳转到其中一个站点,具体表现为: ...

  8. 制作一个ip多域名访问,或一个ip不同端口访问,或多个ip访问的网站。

    环境:windows server 2008 64位 一.在windows2008上安装IIS服务 下一步 安装完成关闭 二.搭建测试网站 127.0.0.1连接测试 域名测试 修改host文件 C: ...

  9. 实现一个黑名单的功能,将指定来源的ip地址加入到黑名单,后续该ip地址访问服务器全部不予访问。

    实现一个黑名单的功能,将指定来源的ip地址加入到黑名单,后续该ip地址访问服务器全部不予访问. 结构: 代码: BlackListListener.java @WebListener("/c ...

  10. CentOS之——双网卡双IP双网关配置(双网卡配置一个上外网一个接局域网)

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/77487639 一.配置讲解 1.配置DNS 修改对应网卡的DNS的配置文件 # v ...

最新文章

  1. springBoot 打war包 程序包com.sun.istack.internal不存在的问题
  2. Java8 Stream 使用
  3. 3详细参数_【前沿】一加7Pro拍照详细参数曝光 3倍光变30W快充
  4. 业务基础【概念说明】-userAgent
  5. Xcode执行Analyze静态分析
  6. 不用第三方库,也能用 Python 作图,效果还不错
  7. 无法定位程序输入点 在.exe上_win7提示explorer.exe应用程序错误的解决方法
  8. 全栈测试:平衡单元测试和端到端测试
  9. 孩子从全班倒数第一到第二名,这位妈妈只做了这1件事!
  10. 学习linux中踩的坑,踩踩Linux命令中的那些坑
  11. Spring框架中ApplicationContext与BeanFactory的区别
  12. 【leetcode】Merge Sorted Array
  13. Java JSON解析教程
  14. 网络广告公司的恐慌 XSS广告终结者(html5新特性)
  15. python安装numpy库教程_Python库之numpy库的安装教程
  16. web前端设计与开发期末作品/期末大作业:我的家乡——走进达州(4页) HTML+CSS+JavaScript
  17. 从零到一学爬虫-爬取微博热搜示例
  18. ikbc 104键win键失效
  19. 物联网应用系统三层结构的设计_基于物联网技术的智能油烟在线监测系统的设计与应用...
  20. 「安全系列之CSRF」如何防范csrf攻击

热门文章

  1. oracle sql判断相等,获取多行相等的人员(Oracle SQL)
  2. python语言入门r_小结:jieba分词的Python与R语言基础用法介绍
  3. 使用OpenCV和Python计算图像的“彩色度”
  4. 数字图像处理:边缘检测(Edge detection)
  5. keras 的 example 文件 babi_memnn.py 解析
  6. keras 的 example 文件 mnist_hierarchical_rnn.py 解析
  7. XOR and Favorite Number CF340E 莫队算法
  8. mysqlorderby数字字符串排序_Python中的元组排序和深度比较
  9. python中 doc_python中doc转pdf
  10. 强化学习(一)- 强化学习介绍、Markov决策过程和贝尔曼期望方程