首页 > 解决方案 > 如何从此格式获取这些范围内的所有 IP 地址?

问题描述

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

213.159.160.0-213.159.191.255
84.44.115.72-84.44.115.79

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

标签: c#ip-address

解决方案


像这样的东西呢?:

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 对象。

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

在线尝试


推荐阅读