前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >判断一个IP区间(或IP)是否被另一个IP区间所包含

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

作者头像
Java架构师必看
发布2021-03-22 10:32:10
8320
发布2021-03-22 10:32:10
举报
文章被收录于专栏:Java架构师必看

以下方法实现判断一个IP是否被一个IP区间所包含有一些静态方法可能引用了同名空间的自定义的类,至于合

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

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

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

代码语言:javascript
复制
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
  }
 }

本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档