要判断一个 IP 地址是否在特定的网段范围内,可以将 IP 地址和网段起始与结束的 IP 地址都转换为整数,然后进行比较。以下是一个用 Java 实现的示例代码,用于判断给定的 IP 地址是否在 106.91.0.0
到 106.91.255.255
网段范围内。
实现步骤
-
将 IP 地址转换为整数:IP 地址可以看作是一个 32 位的整数。每个段(如
106
)占用 8 位,因此整个 IP 地址可以表示为一个 32 位整数。 -
比较整数值:将 IP 地址的整数值与网段起始和结束的整数值进行比较。
代码实现
import java.net.InetAddress;
import java.net.UnknownHostException;
public class IpRangeChecker {
public static void main(String[] args) {
String ipToCheck = "106.91.50.100"; // 要检查的IP地址
String startIp = "106.91.0.0"; // 网段起始IP
String endIp = "106.91.255.255"; // 网段结束IP
try {
boolean isInRange = isIpInRange(ipToCheck, startIp, endIp);
System.out.println("IP " + ipToCheck + " 是否在范围内: " + isInRange);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
public static boolean isIpInRange(String ip, String startIp, String endIp) throws UnknownHostException {
long ipToCheck = ipToLong(InetAddress.getByName(ip));
long start = ipToLong(InetAddress.getByName(startIp));
long end = ipToLong(InetAddress.getByName(endIp));
return ipToCheck >= start && ipToCheck <= end;
}
// 将IP地址转换为整数
public static long ipToLong(InetAddress ip) {
byte[] octets = ip.getAddress();
long result = 0;
for (byte octet : octets) {
result <<= 8;
result |= octet & 0xFF;
}
return result;
}
}
代码解释
-
ipToLong
方法:将InetAddress
转换为一个 32 位的整数表示。这个整数表示 IP 地址的实际值,使得我们可以对其进行数值比较。 -
isIpInRange
方法:将要检查的 IP 地址、起始 IP 地址和结束 IP 地址都转换为整数,然后判断该 IP 地址是否在范围内。 -
InetAddress.getByName()
:用于将字符串形式的 IP 地址转换为InetAddress
对象。
运行结果
如果你运行以上代码,并将 ipToCheck
设为 106.91.50.100
,输出将是:
IP 106.91.50.100 是否在范围内: true
总结
- 将 IP 地址转换为整数后,可以轻松判断 IP 地址是否在某个范围内。
- 这种方法可以用于任何 IPv4 地址的范围判断,且代码逻辑简单、易于理解。
a. 尝试扩展代码,使其支持多个网段的范围检查。
b. 了解如何处理 IPv6 地址的范围判断。