package com.ticomm.flow.util; import java.util.ArrayList; import java.util.List; /** * 〈一句话功能简述〉<br> * 〈IP地址工具类〉 */ public class IPUtils { public static void main(String[] args) { List<String> ipList = getSubIpList("192.168.1.1", 24); ipList.forEach(ip -> System.out.println(ip)); } /** * 通过掩码,获取IP地址段IP列表 * @param ip IP地址 * @param mask 掩码 * @return */ public static List<String> getSubIpList(String ip, int mask) { //地址 long start = ipToLong(ip); //ip地址个数 long number = ipCount(mask); //掩码 long lmask = maskToLong(mask); //String startIp = (longToIP(start & lmask)); //String endIp = (longToIP((start & lmask) + number)); List<String> ipList = new ArrayList<>(); for(int i=0; i<number; i++) { ipList.add(longToIP((start & lmask) + i)); } return ipList; } /** * 计算出掩码指定的IP地址个数 如: 24 * @param mask 掩码 * @return */ private static long ipCount(int mask) { return (long)Math.pow(2, (32 - mask)); } /** * 分割IP地址 * @param ip IP地址 * @return */ private static long[] splitIp(String ip) { long[] ipArray = new long[4]; if(Tools.isNotEmpty(ip) && ip.split("\\.").length == 4) { String[] ipNums = ip.split("\\."); ipArray[0] = Long.parseLong(ipNums[0]); ipArray[1] = Long.parseLong(ipNums[1]); ipArray[2] = Long.parseLong(ipNums[2]); ipArray[3] = Long.parseLong(ipNums[3]); } return ipArray; } /** * 将10.0.0.0形式的ip地址转换成10进制整数 * @param str IP地址 * @return */ private static long ipToLong(String str) { long[] ip = splitIp(str); if (ip != null) { return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3]; } else { return 0; } } /** * 将10.0.0.0形式的掩码地址转换成10进制整数 * @param mask 掩码 * @return */ private static long maskToLong(int mask){ long longMask = 0; for (int i = 31; i >= 32-mask; i--) { longMask += Math.pow(2, i); } return longMask; } /** * 将10进制整数形式转换成127.0.0.1形式的IP地址 * @param longIp long类型的IP地址 * @return */ private static String longToIP(long longIp) { StringBuffer sb = new StringBuffer(""); sb.append(String.valueOf(longIp >>> 24));// 右移24位 sb.append("."); sb.append(String.valueOf((longIp & 0x00FFFFFF) >>> 16)); // 将高8位置0,然后右移16位 sb.append("."); sb.append(String.valueOf((longIp & 0x0000FFFF) >>> 8)); sb.append("."); sb.append(String.valueOf(longIp & 0x000000FF)); return sb.toString(); } }
IP地址工具类 IP地址计算
最新推荐文章于 2023-05-04 16:46:02 发布