[英]Calculate whether an IP address is in a specified range in Java
我希望能夠根據 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
檢查范圍的最簡單方法可能是將 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 查找的可能性。
以下代碼使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.