判断两个IP是否在同一网段


import org.apache.commons.compress.utils.Lists;

import java.util.List;

public class NetUtil {

        private static final String DEFALUT_SUBNET_MASK = "255.255.255.0";

        public static void main(String[] args) {
            System.out.println(isSameNetWork("192.168.1.1", "192.166.2.1"));
            System.out.println(isSameNetWork("192.168.1.1", "192.168.3.3"));
            System.out.println(isSameNetWork("117.20.116.233", "117.20.116.40"));

        }

       public static boolean isSameNetWork(String ip, String compareIp){
           List<String> ipList = calculate(ip, DEFALUT_SUBNET_MASK);
           List<String> sub = calculate(compareIp, DEFALUT_SUBNET_MASK);
           if(!ipList.get(0).equals(sub.get(0))){
                return false;
           }
           return ipList.get(1).equals(sub.get(1));
       }

    /**
     * 根据原始ip子网掩码通过亦或计算得到网段
     * @param ip
     * @param subNetMask 子网掩码
     * @return
     */
    private static List<String> calculate(String ip, String subNetMask){
        //ip
        String[] ipArray = ip.split("\\.");
        String[] ipBinary = new String[4];
        for (int i=0; i<ipArray.length; i++) {
            ipBinary[i] = leftPadding0(Integer.toBinaryString(Integer.parseInt(ipArray[i])), 8);
        }
        //掩码
        String[] subNetMaskArray = subNetMask.split("\\.");
        String[] subNetMaskBinary = new String[4];
        for (int i=0; i<subNetMaskArray.length; i++) {
            subNetMaskBinary[i] = leftPadding0(Integer.toBinaryString(Integer.parseInt(subNetMaskArray[i])), 8);
        }

        List<String> binaryIp = Lists.newArrayList();
        for(int i=0; i<ipBinary.length; i++){
            String item = ipBinary[i];
            String[] itemArray = new String [item.length()];
            for(int j=0; j<item.length(); j++){
                itemArray[j] = item.substring(j, j+1);
            }
            String sub = subNetMaskBinary[i];
            String[] subArray = new String [sub.length()];
            for(int j=0; j<sub.length(); j++){
                subArray[j] = sub.substring(j, j+1);
            }
            StringBuilder ipBuffer = new StringBuilder();
            for(int k=0; k< itemArray.length; k++) {
                String and  = String.valueOf(Integer.parseInt(itemArray[k]) ^ Integer.parseInt(subArray[k]));
                ipBuffer.append(and);
            }
            binaryIp.add(ipBuffer.toString());
        }
        return binaryIp;
    }

    /**
     * 左补0
     * @param oriStr 原字符串
     * @param length 补0后的总长度
     * @return
     */
    private static String leftPadding0(String oriStr, int length){
        if(oriStr.length() == length){
            return oriStr;
        }
        StringBuilder zero =  new StringBuilder();
        for(int i=0; i< length - oriStr.length(); i++){
             zero.append("0");
        }
        return zero.toString() + oriStr;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值