任何人都知道如何比较 2 个 ipaddress 以查看 ipaddress 是否低于另一个。
IE
bool b = CurrentIpAddress.IsLowerCompareTo(AnotherIPAddress);
我还想同时支持 IPV4 和 IPV6。
任何人都知道如何比较 2 个 ipaddress 以查看 ipaddress 是否低于另一个。
IE
bool b = CurrentIpAddress.IsLowerCompareTo(AnotherIPAddress);
我还想同时支持 IPV4 和 IPV6。
您可以调用IPAddress.GetAddressBytes并编写一个 for 循环来比较每个单独的字节。
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));
}
您可以使用此项目进行 IP 地址比较:
http://www.codeproject.com/Articles/26550/Extending-the-IPAddress-object-to-allow-relative-c
您可以将每个 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,但可以修改为这样做。