要在java
中判断一个ip地址
是否在给定的网段内,可以使用子网掩码
将ip地址
和子网掩码
进行与操作
来提取网络地址,并将其与给定的子网地址进行比较。
方法一:借助于 java 提供的 inetaddress
下面的例子由强大的 chatgpt
提供。
代码如下所示(子网掩码的计算可以截取字符串后,借助底部的算法进行获得):
public static boolean isipaddressinsubnet(string ipaddress, string subnetaddress, string subnetmask) throws unknownhostexception { inetaddress inetaddress = inetaddress.getbyname(ipaddress); inetaddress subnet = inetaddress.getbyname(subnetaddress); inetaddress mask = inetaddress.getbyname(subnetmask); byte[] inetaddressbytes = inetaddress.getaddress(); byte[] subnetbytes = subnet.getaddress(); byte[] maskbytes = mask.getaddress(); for (int i = 0; i < inetaddressbytes.length; i++) { int addressbyte = inetaddressbytes[i] & 0xff; int subnetbyte = subnetbytes[i] & 0xff; int maskbyte = maskbytes[i] & 0xff; if ((addressbyte & maskbyte) != (subnetbyte & maskbyte)) { return false; } } return true; }
这个方法接受三个参数:
要检查的ip地址
、子网地址
和子网掩码
。它使用inetaddress
类将这些字符串转换为java对象,然后将它们转换为字节数组。然后,它迭代每个字节,并将每个字节的值与相应的子网字节和掩码字节进行比较,以提取网络地址。
如果网络地址与子网地址不匹配,则返回false
,否则返回true
。
例如,假设我们要检查ip地址 “192.168.1.100
” 是否在子网"192.168.1.0/24
"中:
boolean result = isipaddressinsubnet("192.168.1.100", "192.168.1.0", "255.255.255.0"); if (result) { system.out.println("ip address is in subnet"); } else { system.out.println("ip address is not in subnet"); }
方法二:撸个算法实现(二进制计算)
代码来源于 google
,但是明白原理即可,不需要深究。
不管怎么样肯定都会需要 ip 地址
和子网掩码
才能组成一个子网范围;然后判断另一个给定的 ip
是否在这个网段内。
/** * 判断是否在该网段中 * * @param subnetrange 子网范围 x.x.x.x/xx 形式 */ public static boolean isipaddressinsubnet(string ipaddress, string subnetrange) { string[] networkips = ipaddress.split("\\."); int ipaddr = (integer.parseint(networkips[0]) << 24) | (integer.parseint(networkips[1]) << 16) | (integer.parseint(networkips[2]) << 8) | integer.parseint(networkips[3]); // 拿到主机数 int type = integer.parseint(subnetrange.replaceall(".*/", "")); int ipcount = 0xffffffff << (32 - type); string maskip = subnetrange.replaceall("/.*", ""); string[] maskips = maskip.split("\\."); int cidripaddr = (integer.parseint(maskips[0]) << 24) | (integer.parseint(maskips[1]) << 16) | (integer.parseint(maskips[2]) << 8) | integer.parseint(maskips[3]); return (ipaddr & ipcount) == (cidripaddr & ipcount); }
例如,假设我们要检查ip地址 “192.168.1.100
” 是否在子网"192.168.1.0/24
"中:
boolean result = isipaddressinsubnet("192.168.1.100", "192.168.1.0/24"); if (result) { system.out.println("ip address is in subnet"); } else { system.out.println("ip address is not in subnet"); }
其他
数字转为子网掩码
public static string subnetmaskfromprefixlength(int prefixlength) { if (prefixlength < 0 || prefixlength > 32) { throw new illegalargumentexception("invalid prefix length"); } int mask = 0xffffffff << (32 - prefixlength); return string.format("%d.%d.%d.%d", (mask & 0xff000000) >>> 24, (mask & 0x00ff0000) >>> 16, (mask & 0x0000ff00) >>> 8, (mask & 0x000000ff)); }
示例:
string subnetmask = subnetmaskfromprefixlength(24); system.out.println(subnetmask); // 输出:255.255.255.0
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论