Java计算IP地址是否在指定范围内

新手上路,请多包涵

我希望能够根据位于其他两个 IP 范围内的 IP 返回 true/false。

例如:

ip 192.200.3.0

range from 192.200.0.0

range to 192.255.0.0

应该结果为真。

其他例子:

 assert 192.200.1.0 == true
assert 192.199.1.1 == false
assert 197.200.1.0 == false

原文由 Shervin Asgari 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

检查范围的最简单方法可能是将 IP 地址转换为 32 位整数,然后只比较整数。

 public class Example {
    public static long ipToLong(InetAddress ip) {
        byte[] octets = ip.getAddress();
        long result = 0;
        for (byte octet : octets) {
            result <<= 8;
            result |= octet & 0xff;
        }
        return result;
    }

    public static void main(String[] args) throws UnknownHostException {
        long ipLo = ipToLong(InetAddress.getByName("192.200.0.0"));
        long ipHi = ipToLong(InetAddress.getByName("192.255.0.0"));
        long ipToTest = ipToLong(InetAddress.getByName("192.200.3.0"));

        System.out.println(ipToTest >= ipLo && ipToTest <= ipHi);
    }
}

而不是 InetAddress.getByName() ,您可能想看看 Guava 库,它有一个 InetAddresses 帮助程序类,可以避免 DNS 查找的可能性。

原文由 hallidave 发布,翻译遵循 CC BY-SA 4.0 许可协议

以下代码使用 IPAddress Java 库(免责声明:我是项目经理)使用 IPv4 和 IPv6 地址处理此问题,并且还避免了对无效字符串的 DNS 查找。

以下是一些示例代码,其中包含您给定的地址以及一些 IPv6 地址:

 static void range(String lowerStr, String upperStr, String str)
        throws AddressStringException  {
    IPAddress lower = new IPAddressString(lowerStr).toAddress();
    IPAddress upper = new IPAddressString(upperStr).toAddress();
    IPAddress addr = new IPAddressString(str).toAddress();
    IPAddressSeqRange range = lower.toSequentialRange(upper);
    System.out.println(range + " contains " + addr + " " + range.contains(addr));
}

range("192.200.0.0", "192.255.0.0", "192.200.3.0");
range("2001:0db8:85a3::8a2e:0370:7334", "2001:0db8:85a3::8a00:ff:ffff",
    "2001:0db8:85a3::8a03:a:b");
range("192.200.0.0", "192.255.0.0", "191.200.3.0");
range("2001:0db8:85a3::8a2e:0370:7334", "2001:0db8:85a3::8a00:ff:ffff",
    "2002:0db8:85a3::8a03:a:b");

输出:

 192.200.0.0 -> 192.255.0.0 contains 192.200.3.0 true
2001:db8:85a3::8a00:ff:ffff -> 2001:db8:85a3::8a2e:370:7334 contains 2001:db8:85a3::8a03:a:b true
192.200.0.0 -> 192.255.0.0 contains 191.200.3.0 false
2001:db8:85a3::8a00:ff:ffff -> 2001:db8:85a3::8a2e:370:7334 contains 2002:db8:85a3::8a03:a:b false

原文由 Sean F 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题