IP地址工具类 IP地址计算

17 篇文章 0 订阅
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();
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值