首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将IPRanges合并为一个范围

将IPRanges合并为一个范围
EN

Stack Overflow用户
提问于 2013-02-20 22:54:53
回答 1查看 449关注 0票数 0

我有以下小班:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-20 23:43:28

您可以通过比较字节来检查任意类型(但相同类型)的两个地址,例如IPv6地址:

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

代码语言:javascript
复制
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地址,如下所示:

代码语言:javascript
复制
var ipv6 = ipv4.MapToIPv6();

如果您确定您始终拥有IPv4地址,则可以仅比较它们的整数值:

代码语言:javascript
复制
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"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14982832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档