java判断ip是否为指定网段
前言
这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。
作者:神的孩子都在歌唱
一、IP地址介绍
1.1 IP(IPv4)
IP是Internet Protocol的缩写,即网际协议,它是计算机网络体系结构中的网络层协议。IPv4使用32位地址(IPv6为128位),通常采用点分十进制表示,例如:192.168.1.47
。这个地址由两部分组成:网络位和主机位。
-
网络位:用于标识设备所属的网络。
-
主机位:用于标识该网络中的具体设备。
传统的IPv4地址被分为A、B、C、D、E五类:
-
A类地址:用于大型网络,网络位为8位,主机位为24位。
-
地址范围:
1.0.0.0
到126.255.255.255
-
-
B类地址:用于中型网络,网络位为16位,主机位为16位。
-
地址范围:
128.0.0.0
到191.255.255.255
-
-
C类地址:用于小型网络,网络位为24位,主机位为8位。
-
地址范围:
192.0.0.0
到223.255.255.255
-
-
D类地址:用于组播。
-
E类地址:保留地址,未分配使用。
1.3 私有地址
某些地址被保留作为私有网络使用,无法在公网访问:
-
A类私有地址:
10.0.0.0
到10.255.255.255
-
B类私有地址:
172.16.0.0
到172.31.255.255
-
C类私有地址:
192.168.0.0
到192.168.255.255
1.4 子网划分 & 子网掩码
子网掩码也是32位长,用于区分网络位和主机位。掩码网络位用1
表示,主机位用0
表示。
子网掩码的表示方式:
-
点分十进制表示法:例如
255.255.255.0
-
位计数表示法:例如
/24
,表示网络位占24位。
作用: 子网掩码的作用是确定一个IP地址的网络位长度,从而识别出IP所属的子网。
二. 判断IP是否在网段中(Java)
以下是一个用于判断给定IP是否属于指定网段的Java代码示例:
public static boolean ipIsInNet(String ip, String ipArea) {
if ("127.0.0.1".equals(ip)) {
return true;
}
if(StringUtils.isBlank(ipArea)){
return false;
}
String[] ipArray = ipArea.split(",");
for (String s : ipArray) {
if (!s.contains("/")) {
if (s.equals(ip)) {
return true;
}
continue;
}
String[] ips = ip.split("\\.");
int ipAddress = (Integer.parseInt(ips[0]) << 24)
| (Integer.parseInt(ips[1]) << 16)
| (Integer.parseInt(ips[2]) << 8)
| Integer.parseInt(ips[3]);
int type = Integer.parseInt(s.replaceAll(".*/", ""));
int mask = 0xFFFFFFFF << (32 - type);
String cidrIp = s.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]);
if ((ipAddress & mask) == (cidrIpAddr & mask)) {
return true;
}
}
return false;
}
这个代码可以用来判断某个IP地址是否属于指定的IP网段。
参考文章:
作者:神的孩子都在歌唱
本人博客:https://blog.csdn.net/weixin_46654114
- 点赞
- 收藏
- 关注作者
评论(0)