Java计算一个IP地址是不是在指定范围内
Posted
技术标签:
【中文标题】Java计算一个IP地址是不是在指定范围内【英文标题】:Calculate whether an IP address is in a specified range in JavaJava计算一个IP地址是否在指定范围内 【发布时间】:2011-05-14 11:24:02 【问题描述】:我希望能够根据 IP 在其他两个 IP 范围内返回真/假。
例如:
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
【问题讨论】:
【参考方案1】:检查范围的最简单方法可能是将 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()
,您可能希望查看具有InetAddresses 帮助类的Guava 库,该类可以避免DNS 查找的可能性。
【讨论】:
这非常有帮助。谢谢。 InetAddresses Guava 类非常有用。谢谢! 对于所有的IPV4,也许这段代码很干净。 new BigInteger(1, InetAddress.getByName(host).getAddress()).longValue() @martian 已移至google.github.io/guava/releases/25.0-jre/api/docs/com/google/…【参考方案2】:以下代码使用IPAddress Java library(免责声明:我是项目经理)使用 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
【讨论】:
以上是关于Java计算一个IP地址是不是在指定范围内的主要内容,如果未能解决你的问题,请参考以下文章