c#中计算一个ip是不是在指定范围内?

Posted

技术标签:

【中文标题】c#中计算一个ip是不是在指定范围内?【英文标题】:Calculate whether an ip is in a specified range in c#?c#中计算一个ip是否在指定范围内? 【发布时间】:2014-07-31 13:06:55 【问题描述】:

我有一个包含 IP 和国家/地区范围的数据库。 我得到了用户IP,想知道国家

数据是

from     |to     |country
-------------------------
1.1.1.1.1|2.2.2.2| US
5.5.5.5.5|6.6.6.6| CN

我怎样才能找到ip 5.6.0.0是哪个国家?

【问题讨论】:

什么样的IP地址有五个用点分隔的值? IPV5?尝试将 IPV4 地址转换为 uint 值并进行比较。 1.2.3.4 => ( ( ( 1 * 256 + 2 ) * 256 + 3 ) * 256 + 4. 已经有一些答案了 - 1, 2 【参考方案1】:

用“.”分割地址后,您可以简单地检查一下。开始对每个拆分值进行从左到右的比较。

例如:

bool BelongsOrNot(String from, String to, String ip) 
   String []froms = from.Split(".");
   String []tos = to.Split(".");
   String []ips = ip.Split(".");
   for(var i=0;i<ips.length; i++)
      int ipi = Int32.Parse(ips[i]);
      int fromi = Int32.Parse(frons[i]);
      int toi = Inte32.Parse(tos[i]);
      if(toi>ipi && fromi < ipi)
        return false;
      
   
   return true;

希望这会有所帮助。

【讨论】:

【参考方案2】:

新建类IP如下:

public class IP : System.Net.IPAddress, IComparable<IP>

    public IP(long newAddress) : base(newAddress)
    
    

    public IP(byte[] address, long scopeid) : base(address, scopeid)
    
    

    public IP(byte[] address) : base(address)
    
    


    public int CompareTo(IP other)
    
        byte[] ip1 = GetAddressBytes();
        byte[] ip2 = other.GetAddressBytes();
        for (int i = 0; i < ip1.Length; i++)
        
            if (ip1[i] > ip2[i])
                return 1;
            if (ip1[i] < ip2[i])
                return -1;
        
        return 0;
    

检查指定的IP是否属于范围:

IP ipRangeLow = new IP(new byte[]  5, 5, 5, 5 );
IP ipRangeHigh = new IP(new byte[]  6, 6, 6, 6 );

IP ip = new IP(new byte[]  5, 6, 0, 0 );
bool ipInRange = ip.CompareTo(ipRangeLow) >= 0 && ip.CompareTo(ipRangeHigh) <= 0;

【讨论】:

以上是关于c#中计算一个ip是不是在指定范围内?的主要内容,如果未能解决你的问题,请参考以下文章

计算一个坐标是不是在另一个坐标范围内

计算列表是不是在数据库值的“范围内”

从子网掩码计算 IP 范围

C# - 识别另一个网络上的计算机

C# 计算地图上某个坐标点的是否在多边形内

如何计算年龄是不是在出生年份的范围内,同时从Django ORM中的Db获取出生年份