我有以下小班:
public class IPRange
{
public IPAddress From { get; set; }
public IPAddress To { get; set; }
public IPRange(IPAddress from, IPAddress to)
{
From = from;
To = to;
}
}如何检查两个IPRanges是否相互重叠?如果是,如何将两个IPRange合并为一个新ipranges?该解决方案必须同时符合IPv4和IPv6。
有没有比较两个ipaddress对象的方法?我不能立即找到他们。例如,10.12.0.2 > 10.12.0.1应为true
发布于 2013-02-20 23:43:28
您可以通过比较字节来检查任意类型(但相同类型)的两个地址,例如IPv6地址:
IPAddress addr1 = IPAddress.Parse("2001:db8::1:2");
IPAddress addr2 = IPAddress.Parse("2001:db8::1:1");
var bytes1 = addr1.GetAddressBytes();
var bytes2 = addr2.GetAddressBytes();
Console.WriteLine(CompareBytes(bytes1, bytes2) > 0); // Prints: "True"和CompareBytes方法:
private static int CompareBytes(byte[] left, byte[] right)
{
// TODO: Null checks.
// TODO: Check that left and right have the same length.
int difference = 0;
for (int i = left.Length - 1; i >= 0; i--)
{
difference = left[i] - right[i];
if (difference != 0)
break;
}
return difference;
}无论您的代码运行在何种字节顺序的系统上,这种方法都可以工作。
您可以将任何IPv4地址转换为等效的IPv6地址,如下所示:
var ipv6 = ipv4.MapToIPv6();如果您确定您始终拥有IPv4地址,则可以仅比较它们的整数值:
IPAddress addr1 = IPAddress.Parse("10.12.0.2");
IPAddress addr2 = IPAddress.Parse("10.12.0.1");
uint value1 = BitConverter.ToUInt32(addr1.GetAddressBytes(), 0);
uint value2 = BitConverter.ToUInt32(addr2.GetAddressBytes(), 0);
Console.WriteLine(value1 > value2); // Prints: "True"https://stackoverflow.com/questions/14982832
复制相似问题