【问题标题】:How to get all IP address in these ranges from this format?如何从此格式获取这些范围内的所有 IP 地址?
【发布时间】:2018-12-28 11:39:17
【问题描述】:

如何通过这种格式计算出该范围内的所有 IP 地址?

213.159.160.0-213.159.191.255
84.44.115.72-84.44.115.79

我找到了84.44.115.1/23 格式的示例,但没有找到上述格式的示例。

【问题讨论】:

  • 请告诉我们,到目前为止你做了什么。
  • 一种简单的方法是将上限和下限转换为整数表示。那么,介于两者之间的所有自然数都是您的 IP 地址。
  • 只是想要两个值之间的 IP 地址列表还是想要子网划分?
  • 我通常不会回答“给我代码”的问题,因为您没有付出任何努力,但我想我还是想为了好玩而这样做,所以我已经回答了。以后,我建议先展示您尝试过的内容。

标签: c# ip-address


【解决方案1】:

这样的事情怎么样?:

public static IPAddress[] GetAddresses(string rangeString)
{
    var match = Regex.Match(rangeString, @"(?<ip1>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})-(?<ip2>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})");
    if (!match.Success || !IPAddress.TryParse(match.Groups["ip1"].Value, out IPAddress ip1) || !IPAddress.TryParse(match.Groups["ip2"].Value, out IPAddress ip2))
    {
        throw new ArgumentException("Range invalid.");
    }
    return GetAddresses(ip1, ip2);
}

public static IPAddress[] GetAddresses(IPAddress startAddress, IPAddress endAddress)
{
    var startNumber = IPToNumber(startAddress);
    var endNumber = IPToNumber(endAddress);

    var addresses = new List<IPAddress>();
    for (uint i = startNumber; i <= endNumber; ++i)
    {
        addresses.Add(NumberToIP(i));
    }
    return addresses.ToArray();
}

private static UInt32 IPToNumber(IPAddress ip)
{
    var bytes = ip.GetAddressBytes();
    UInt32 result = 0;
    for (int i = 0; i < bytes.Length; ++i)
    {
        result *= 255;
        result += bytes[i];
    }
    return result;
}

private static IPAddress NumberToIP(UInt32 number)
{
    var bytes = new Stack<byte>(4);
    while (number > 0)
    {
        bytes.Push((byte)(number % 255));
        number /= 255;
    }
    return new IPAddress(bytes.ToArray());
}

它将开始和地址转换为UInt32 值,并以数字方式循环,将索引转换回IPAddress 对象。

我不确定您是否需要真正解析范围字符串,所以我将它作为单独的方法添加到顶部。如果您确实需要它,您可以将这些方法合二为一,否则请随意忽略它。

Try it online

【讨论】:

    猜你喜欢
    • 2018-10-08
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2014-07-31
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多