代码之家  ›  专栏  ›  技术社区  ›  Mr J

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

  •  -4
  • Mr J  · 技术社区  · 7 年前

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

    213.159.160.0-213.159.191.255
    84.44.115.72-84.44.115.79
    

    我找到了一些例子 84.44.115.1/23 格式,但没有上述格式。

    1 回复  |  直到 7 年前
        1
  •  1
  •   ProgrammingLlama Raveena Sarda    7 年前

    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

    Try it online

    推荐文章