/**
* 1.IP地址(IPV4)与int类型之间的转换
* 2.判断IP是否在指定范围
*
* @author zlx
* @date 2021/09/10 10:32
**/
public class Ipv4Utils {
static 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)";
static final String REGX_IPB = REGX_IP + "-" + REGX_IP;
/**
* 将IP地址(IPV4)字符串转换为 int类型的数字
* <p>
* 思路:将 IP地址(IPV4)的每一段数字转为 8 位二进制数,并将它们放在结果的适当位置上
*
* @param ipv4String(IPV4) 字符串,如 127.0.0.1
* @return IP地址(IPV4) 字符串对应的 int值
*/
public static int ipv4ToInt(String ipv4String) {
// 取 ip 的各段
String[] ipSlices = ipv4String.split("\\.");
int result = 0;
for (int i = 0; i < ipSlices.length; i++) {
// 将 ip 的每一段解析为 int,并根据位置左移 8 位
int intSlice = Integer.parseInt(ipSlices[i]) << 8 * i;
// 求或
result = result | intSlice;
}
return result;
}
/**
* 将 int类型的数字转换为IP地址(IPV4)字符串
*
* @param ipv4Int 用 int表示的IP地址(IPV4)字符串
* @return IP地址(IPV4)字符串,如 127.0.0.1
*/
public static String intToIpv4(int ipv4Int) {
String[] ipString = new String[4];
for (int i = 0; i < 4; i++) {
// 每 8 位为一段,这里取当前要处理的最高位的位置
int pos = i * 8;
// 取当前处理的 ip 段的值
int and = ipv4Int & (255 << pos);
// 将当前 ip 段转换为 0 ~ 255 的数字,注意这里必须使用无符号右移
ipString[i] = String.valueOf(and >>> pos);
}
return String.join(".", ipString);
}
/**
* 判断IP是否在指定范围
*
* @param ipSection IP地址范围字符串,如 92.168.1.1-192.168.1.20
* @param ip IP地址(IPV4)字符串,如 192.168.1.12
*/
public static boolean ipIsValid(String ipSection, String ip) {
ipSection = ipSection.trim();
ip = ip.trim();
if (!ipSection.matches(REGX_IPB) || !ip.matches(REGX_IP)) {
return false;
}
int idx = ipSection.indexOf('-');
String[] sips = ipSection.substring(0, idx).split("\\.");
String[] sipe = ipSection.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;
}
}
4.IPV4工具类
最新推荐文章于 2024-06-09 09:58:07 发布