Calculate whether an IP address is in a specified range in Java
The easiest way to check the range is probably to convert the IP addresses to 32-bit integers and then just compare the integers.
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);
}
}
Rather than InetAddress.getByName()
, you may want to look at the Guava library which has an InetAddresses helper class that avoids the possibility of DNS lookups.
The following code, using the IPAddress Java library (Disclaimer: I am the project manager) handles this with both IPv4 and IPv6 addresses, and also avoids DNS lookup on invalid strings.
Here is some sample code with your given addresses as well as some IPv6 addresses:
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");
Output:
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