IPUtils

2016-09-28  本文已影响0人  杨可可爱逛街
package com.zte.anyservice.iecs.ros.virtual.zxve.ippool.util;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.zte.anyservice.iecs.ros.virtual.domain.ippool.IpRangeInfo;

public class IpAddressUtil
{
    /**
     * 
     * [简要描述]:ipAdd [详细描述]:ip地址加1,如1.2.3.4加1之后为1.2.3.5
     * 
     * @param ip
     *            ip地址
     * @return e 加1之后的ip地址
     */
    public static String ipAdd(String ip)
    {
        String[] tempArray = ip.split("[.]");
        int[] ipArray = new int[4];
        // 把ip地址的各个子段转换为数字
        for (int i = 0; i < 4; i++)
        {
            ipArray[i] = Integer.parseInt(tempArray[i]);
        }
        // 如果第四段小于255,那么最后一段直接加1
        if (ipArray[3] < 255)
        {
            ipArray[3] = ipArray[3] + 1;
        }
        else
        {
            // 如果第四段等于255,第三段小于255,那么第三段加1,第四段修改成0;
            if (ipArray[2] < 255)
            {
                ipArray[2] = ipArray[2] + 1;
                ipArray[3] = 0;
            }
            else
            {
                // 如果第三段和第四段都是255,第二段小于255,那么第二段加1,第三段和第四段修改为0
                if (ipArray[1] < 255)
                {
                    ipArray[1] = ipArray[1] + 1;
                    ipArray[2] = 0;
                    ipArray[3] = 0;
                }
                else
                {
                    // 如果最后三段都是255,第一段小于255,那么第一段加1,后三段修改为0
                    if (ipArray[0] < 255)
                    {
                        ipArray[0] = ipArray[0] + 1;
                        ipArray[1] = 0;
                        ipArray[2] = 0;
                        ipArray[3] = 0;
                    }
                }
            }
        }
        // 输出ip地址串
        return ipArrayToString(ipArray);
    }

    /**
     * 
     * [简要描述]:ipArrayToString [详细描述]:输出ip地址串
     * 
     * @param ipArray
     *            ip各个子段组成的数组
     * @return e
     */
    private static String ipArrayToString(int[] ipArray)
    {
        return ipArray[0] + "." + ipArray[1] + "." + ipArray[2] + "." + ipArray[3];
    }

    /**
     * 
     * [简要描述]:formatNumStrToBinary [详细描述]:将一个数字串转换为8位二进制字符串返回
     * 
     * @param numStr
     *            数字字符串
     * @return e 对应的8位二进制串,如传参255,返回11111111
     */
    public static String formatNumStrToBinary(String numStr)
    {
        // 转换为二进制串
        String binaryStr = Integer.toBinaryString(Integer.parseInt(numStr));
        // 不足8位,前面补0
        String tempStr = "00000000" + binaryStr;
        // 返回后面的8位字符串
        return tempStr.substring(tempStr.length() - 8, tempStr.length());
    }

    /**
     * 
     * [简要描述]:validateSubnetMask [详细描述]:校验子网掩码是否正确
     * 
     * @param ipMask
     *            子网掩码
     * @return e 是否是正确的子网掩码
     */
    public static Boolean validateSubnetMask(String subnetmask)
    {
        String[] tempArray = subnetmask.split("[.]");
        // 获取子网掩码32位二进制串
        String toBinaryStr = formatNumStrToBinary(tempArray[0]) + formatNumStrToBinary(tempArray[1])
                + formatNumStrToBinary(tempArray[2]) + formatNumStrToBinary(tempArray[3]);
        if (toBinaryStr.indexOf("01") != -1)
        {
            // 如果二进制串中包含有"01"子串,就不是正确的子网掩码
            return false;
        }
        return true;
    }

    /**
     * 
     * [简要描述]:validateIsSameSubnet [详细描述]:验证两个ip地址是否同属于一个子网:两个ip地址分别与子网掩码进行按位与操作,如果结果相同,则同属于一个子网,否则不是
     * 
     * @param ipstart
     *            开始ip
     * @param ipend
     *            结束ip
     * @param subnetmask
     *            子网掩码
     * @return e 开始ip和结束ip是否属于同一子网
     */
    public static Boolean validateIsSameSubnet(String ipstart, String ipend, String subnetmask)
    {
        // 获取每个ip地址的各个段
        String[] ipstartArray = ipstart.split("[.]");
        String[] ipendArray = ipend.split("[.]");
        String[] subnetmaskArray = subnetmask.split("[.]");

        int i;
        for (i = 0; i < 4; i++)
        {
            // 使两个ip地址的对应段分别与子网掩码的对应进行按位与操作
            if ((Integer.parseInt(ipstartArray[i]) & Integer.parseInt(subnetmaskArray[i])) == (Integer
                    .parseInt(ipendArray[i]) & Integer.parseInt(subnetmaskArray[i])))
            {
                // 如果相与的结果相等,进行下一段与操作
                continue;
            }
            // 如果有某个段相与结果不相同,则不是同一子网
            return false;
        }
        if (i == 4)
        {
            // 如果每段的与结果相同,则同属一个子网
            return true;
        }
        return false;
    }
    
  
    
    public static boolean validateIpRange(String ipstart, String ipend, List<IpRangeInfo> ipRangeInfoList){
        int i = 0;
        boolean flag = true;//ip冲突
        while(i < ipRangeInfoList.size()){
            IpRangeInfo record = ipRangeInfoList.get(i);
            if(checkIpRangeIsConflict(ipstart,ipend, record.getIpstart(),record.getIpend())){
                flag = false;//ip不冲突
            }
            if(!checkIpRangeIsConflict(ipstart,ipend, record.getIpstart(),record.getIpend())){
                flag = true;//ip冲突
                break;
            }
            i++;
            
        }
        return flag;
    }

    public static boolean validateFloatIpRange(String floatipstart, String floatipend, List<IpRangeInfo> ipRangeInfoList){
        int i = 0;
        boolean flag = true;
        while(i < ipRangeInfoList.size()){
            IpRangeInfo record = ipRangeInfoList.get(i);
            if(checkIpRangeIsConflict(floatipstart,floatipend, record.getFloatipstart(),record.getFloatipend())){
                flag = false;
            }
            if(!checkIpRangeIsConflict(floatipstart,floatipend, record.getFloatipstart(),record.getFloatipend())){
                flag = true;//ip冲突
                break;
            }
            i++;
        }
        return flag;
    }
    
   
    public static boolean checkIpRangeIsConflict(String inputipstart,
            String inputipend, String targetipstart, String targetipend) {
        if (ipCompare(inputipstart, targetipstart) > 0 
                && ipCompare(inputipstart, targetipend) < 0) {
            return false;//ip范围冲突
        }
        if (ipCompare(inputipend, targetipstart) > 0
                && ipCompare(inputipend, targetipend) < 0) {
            return false;
        }
        if (ipCompare(targetipstart, inputipstart) > 0
                && ipCompare(targetipstart, inputipend) < 0) {
            return false;
        }
        if (ipCompare(targetipend, inputipstart) > 0
                && ipCompare(targetipend, inputipend) < 0) {
            return false;
        }
        if (ipCompare(inputipstart, targetipstart) == 0
                || ipCompare(inputipstart, targetipend) == 0
                || ipCompare(inputipend, targetipstart) == 0
                || ipCompare(inputipend, targetipend) == 0) {
            return false;
        }
        return true;//ip范围不冲突
    }
    
    
    public static int ipCompare(String ip1, String ip2){
        String[] ip1Array = ip1.split("[.]");
        String[] ip2Array = ip2.split("[.]");
        int i =0;
        while( i< ip1Array.length )
        {
            if(Integer.parseInt(ip1Array[i]) > Integer.parseInt(ip2Array[i]))  return 1;
            if(Integer.parseInt(ip1Array[i]) < Integer.parseInt(ip2Array[i]))  return -1;
            i++;
        }
        return 0;
    }
    
    private static boolean match(String regex, String str) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        return matcher.matches();
    }
    
    public static boolean IsCIDRAddress(String ip){
        String  regex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\\/([0-9]|[1-2][0-9]|3[0-2]))$";
        return match(regex, ip);
    }
    
    public static  boolean isIpAddress(String ip)
    {
        String regex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."  
                + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."  
                + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."  
                + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
        
        return match(regex, ip);
    }

    /**
     * 验证邮箱
     *
     * @param 待验证的字符串
     * @return 如果是符合的字符串,返回 <b>true </b>,否则为 <b>false </b>
     */
    public static boolean isEmail(String str) {
        String regex = "^([\\w-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$";
        return match(regex, str);
    }

    /**
     * 验证IP地址
     *
     * @param 待验证的字符串
     * @return 如果是符合格式的字符串,返回 <b>true </b>,否则为 <b>false </b>
     */
    public static boolean isIP(String str) {
        String num = "(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)";
        String regex = "^" + num + "\\." + num + "\\." + num + "\\." + num + "$";
        return match(regex, str);
    }

    /**
     * 验证网址Url
     *
     * @param 待验证的字符串
     * @return 如果是符合格式的字符串,返回 <b>true </b>,否则为 <b>false </b>
     */
    public static boolean IsUrl(String str) {
        String regex = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";
        return match(regex, str);
    }
}

上一篇下一篇

猜你喜欢

热点阅读