如果IP地址低于另一个,则比较IP地址

问题描述 投票:4回答:4

任何人都知道如何比较2 ipaddress,看看ipaddress是否低于另一个。

bool b = CurrentIpAddress.IsLowerCompareTo(AnotherIPAddress);

我还想支持IPV4和IPV6。

c# .net comparison ip-address
4个回答
2
投票

您可以将每个IP地址转换为整数并以这种方式进行比较。如果您可以访问最新.NET Framework的“扩展方法”功能,请尝试以下操作。

public static class IPExtensions
{
   public static int ToInteger(this IPAddress IP)
   {
      int result = 0;

      byte[] bytes = IP.GetAddressBytes();
      result = (int)(bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3]);

      return result;
   }

   //returns 0 if equal
   //returns 1 if ip1 > ip2
   //returns -1 if ip1 < ip2
   public static int Compare(this IPAddress IP1, IPAddress IP2)
   {
       int ip1 = IP1.ToInteger();
       int ip2 = IP2.ToInteger();
       return (((ip1 - ip2) >> 0x1F) | (int)((uint)(-(ip1 - ip2)) >> 0x1F));
   }
}

class Program
{
    static void Main(string[] args)
    {
        IPAddress ip1 = IPAddress.Parse("127.0.0.1");
        IPAddress ip2 = IPAddress.Parse("10.254.254.254");

        if (ip1.Compare(ip2) == 0)
           Console.WriteLine("ip1 == ip2");
        else if (ip1.Compare(ip2) == 1)
           Console.WriteLine("ip1 > ip2");
        else if (ip1.Compare(ip2) == -1)
           Console.WriteLine("ip1 < ip2");
    }
}

编辑这不支持IPv6,但可以修改为这样做。


4
投票

您可以调用IPAddress.GetAddressBytes并编写for循环来比较每个字节。



1
投票

vane有正确的想法,但遗憾的是使用了有符号整数。在他的答案的一个评论中可以明显看出这个问题。如果其中一个结果整数设置了最高位,则将其解释为负数并抛弃比较。

这是一个修改版本(用Linqpad编写,所以不是一个完整的程序),可以产生正确的结果。

public static class IpExtensions
{
    public static uint ToUint32(this IPAddress ipAddress)
    {
        var bytes = ipAddress.GetAddressBytes();

        return ((uint)(bytes[0] << 24)) |
               ((uint)(bytes[1] << 16)) |
               ((uint)(bytes[2] << 8)) |
               ((uint)(bytes[3]));
    }
}

public static int CompareIpAddresses(IPAddress first, IPAddress second)
{
    var int1 = first.ToUint32();
    var int2 = second.ToUint32();
    if (int1 == int2)
        return 0;
    if (int1 > int2)
        return 1;
    return -1;
}

void Main()
{
    var ip1 = new IPAddress(new byte[] { 255, 255, 255, 255 });
    var ip2 = new IPAddress(new byte[] { 0, 0, 0, 0 });
    Console.WriteLine(CompareIpAddresses(ip1, ip2));
}
© www.soinside.com 2019 - 2024. All rights reserved.