如何从此格式获取这些范围内的所有 IP 地址?

贾先生

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

213.159.160.0-213.159.191.255
84.44.115.72-84.44.115.79

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

骆驼

这样的事情怎么样?:

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

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

网上试试

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章