java判斷某個ip是否在一個網段內
計算在 ip/mask共有多少個IP地址的方式: 2的 (32-mask)的次方
例如:192.168.3.4/30 裡共有 2的 (32 - 30) 的次方個IP
java判斷某個ip是否在一個網段內 ip/mask IP+掩碼
package com.ip;
public class IpTest {
public static void main(String[] args) {
System.out.println(isInRange("192.168.1.127", "192.168.1.64/26"));
System.out.println(isInRange("192.168.1.2", "192.168.0.0/23"));
System.out.println(isInRange("192.168.0.1", "192.168.0.0/24"));
System.out.println(isInRange("192.168.0.0", "192.168.0.0/32"));
}
public static boolean isInRange(String ip, String cidr) {
String[] ips = ip.split("\\.");
int ipAddr = (Integer.parseInt(ips[0]) << 24)
| (Integer.parseInt(ips[1]) << 16)
| (Integer.parseInt(ips[2]) << 8) | Integer.parseInt(ips[3]);
int type = Integer.parseInt(cidr.replaceAll(".*/", ""));
int mask = 0xFFFFFFFF << (32 - type);
String cidrIp = cidr.replaceAll("/.*", "");
String[] cidrIps = cidrIp.split("\\.");
int cidrIpAddr = (Integer.parseInt(cidrIps[0]) << 24)
| (Integer.parseInt(cidrIps[1]) << 16)
| (Integer.parseInt(cidrIps[2]) << 8)
| Integer.parseInt(cidrIps[3]);
return (ipAddr & mask) == (cidrIpAddr & mask);
}
}
java 怎樣根據IP來判斷其是否存在某個網段內?0
例如網段:
192.168.2.0/24
192.168.1.0/24
192.168.34.0/26
192.168.33.0/26
String[] subnetsMasks = { ... };
Collection<SubnetInfo> subnets = new ArrayList<SubnetInfo>();
for (String subnetMask : subnetsMasks) {
subnets.add(new SubnetUtils(subnetMask).getInfo());
}
String ipAddress = ...;
for (SubnetInfo subnet : subnets) {
if (subnet.isInRange(ipAddress)) {
System.out.println("IP Address " + ipAddress + " is in range " + subnet.getCidrSignature());
}
}
/**
* 判斷ip是否在指定網段中
* @author dh
* @param iparea
* @param ip
* @return boolean
*/
public static boolean ipIsInNet(String iparea, String ip) {
if (iparea == null)
throw new NullPointerException("IP段不可為空。");
if (ip == null)
throw new NullPointerException("IP不可為空。");
iparea = iparea.trim();
ip = ip.trim();
final String REGX_IP = "((25[0-5]|2[0-4]//d|1//d{2}|[1-9]//d|//d)//.){3}(25[0-5]|2[0-4]//d|1//d{2}|[1-9]//d|//d)";
final String REGX_IPB = REGX_IP + "//-" + REGX_IP;
if (!iparea.matches(REGX_IPB) || !ip.matches(REGX_IP))
return false;
int idx = iparea.indexOf('-');
String[] sips = iparea.substring(0, idx).split("//.");
String[] sipe = iparea.substring(idx + 1).split("//.");
String[] sipt = ip.split("//.");
long ips = 0L, ipe = 0L, ipt = 0L;
for (int i = 0; i < 4; ++i) {
ips = ips << 8 | Integer.parseInt(sips[i]);
ipe = ipe << 8 | Integer.parseInt(sipe[i]);
ipt = ipt << 8 | Integer.parseInt(sipt[i]);
}
if (ips > ipe) {
long t = ips;
ips = ipe;
ipe = t;
}
return ips <= ipt && ipt <= ipe;
}