您的位置:首页 > 编程语言 > Java开发

java判断某个ip是否在一个网段内 ip/mask IP+掩码

2016-04-21 13:40 946 查看
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: