最近项目中需要校验某个ipv4是否在某个网段中,从网上找到了一些方法,下面做一下总结。
1.通过直接判断的方式,代码如下
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
);
}
此方法使用示例:
public static void main(String
[] args
) {
System
.out
.println(isInRange("1.2.3.9","1.2.3.6/1"));
System
.out
.println(isInRange("1.2.3.9","1.2.3.6/12"));
System
.out
.println(isInRange("1.2.3.9","1.2.3.6/29"));
System
.out
.println(isInRange("1.2.3.9","1.2.3.6/36"));
}
2.可以先把网段转换成起始到结束ip,然后都转成数字,在判断是否在范围内,代码如下
public static String
getStartIp(String segment
) {
StringBuffer startIp
= new StringBuffer();
if (segment
== null
) {
return null
;
}
String arr
[] = segment
.split("/");
String ip
= arr
[0];
String maskIndex
= arr
[1];
String mask
= getNetMask(maskIndex
);
if (4 != ip
.split("\\.").length
|| mask
== null
) {
return null
;
}
int ipArray
[] = new int[4];
int netMaskArray
[] = new int[4];
for (int i
= 0; i
< 4; i
++) {
try {
ipArray
[i
] = Integer
.parseInt(ip
.split("\\.")[i
]);
netMaskArray
[i
] = Integer
.parseInt(mask
.split("\\.")[i
]);
if (ipArray
[i
] > 255 || ipArray
[i
] < 0 || netMaskArray
[i
] > 255 || netMaskArray
[i
] < 0) {
return null
;
}
ipArray
[i
] = ipArray
[i
] & netMaskArray
[i
];
if(i
==3){
startIp
.append(ipArray
[i
]+1);
}else{
startIp
.append(ipArray
[i
]+".");
}
} catch (NumberFormatException e
) {
System
.out
.println(e
.getMessage());
}
}
return startIp
.toString();
}
public static String
getEndIp(String segment
) {
StringBuffer endIp
=new StringBuffer();
String startIp
= getStartIp(segment
);
if (segment
== null
) {
return null
;
}
String arr
[] = segment
.split("/");
String maskIndex
= arr
[1];
int hostNumber
= 0;
int startIpArray
[] = new int[4];
try {
hostNumber
=1<<32-(Integer
.parseInt(maskIndex
));
for (int i
= 0; i
<4; i
++) {
startIpArray
[i
] = Integer
.parseInt(startIp
.split("\\.")[i
]);
if(i
== 3){
startIpArray
[i
] = startIpArray
[i
] - 1;
break;
}
}
startIpArray
[3] = startIpArray
[3] + (hostNumber
- 1);
} catch (NumberFormatException e
) {
System
.out
.println(e
.getMessage());
}
if(startIpArray
[3] >255){
int k
= startIpArray
[3] / 256;
startIpArray
[3] = startIpArray
[3] % 256;
startIpArray
[2] = startIpArray
[2] + k
;
}
if(startIpArray
[2] > 255){
int j
= startIpArray
[2] / 256;
startIpArray
[2] = startIpArray
[2] % 256;
startIpArray
[1] = startIpArray
[1] + j
;
if(startIpArray
[1] > 255){
int k
= startIpArray
[1] / 256;
startIpArray
[1] = startIpArray
[1] % 256;
startIpArray
[0] = startIpArray
[0] + k
;
}
}
for(int i
= 0; i
< 4; i
++){
if(i
== 3){
startIpArray
[i
] = startIpArray
[i
] - 1;
}
if("" == endIp
.toString()||endIp
.length()==0){
endIp
.append(startIpArray
[i
]);
}else{
endIp
.append("." + startIpArray
[i
]);
}
}
return endIp
.toString();
}
public static String
getNetMask(String maskIndex
) {
StringBuilder mask
= new StringBuilder();
Integer inetMask
= 0;
try {
inetMask
= Integer
.parseInt(maskIndex
);
} catch (NumberFormatException e
) {
System
.out
.println(e
.getMessage());
return null
;
}
if (inetMask
> 32) {
return null
;
}
int num1
= inetMask
/ 8;
int num2
= inetMask
% 8;
int array
[] = new int[4];
for (int i
= 0; i
< num1
; i
++) {
array
[i
] = 255;
}
for (int i
= num1
; i
< 4; i
++) {
array
[i
] = 0;
}
for (int i
= 0; i
< num2
; num2
--) {
array
[num1
] += 1 << 8 - num2
;
}
for (int i
= 0; i
< 4; i
++) {
if (i
== 3) {
mask
.append(array
[i
]);
} else {
mask
.append(array
[i
] + ".");
}
}
return mask
.toString();
}
使用示例:
public static void main(String
[] args
) {
System
.out
.println(getStartIp("1.2.3.6/12"));
System
.out
.println(getEndIp("1.2.3.6/12"));
}
ipv4地址转换成数字:
public static long ipToLong(String ipAddress
) {
long result
= 0;
String
[] ipAddressInArray
= ipAddress
.split("\\.");
for (int i
= 3; i
>= 0; i
--) {
long ip
= Long
.parseLong(ipAddressInArray
[3 - i
]);
result
|= ip
<< (i
* 8);
}
return result
;
}
转载请注明原文地址: https://lol.8miu.com/read-23145.html