Converting CIDR address to subnet mask and network address

前端 未结 11 692
既然无缘
既然无缘 2020-11-29 01:32

Given a CIDR address, e.g. 192.168.10.0/24

  • How to determine mask length? (24)
  • How to determine mask address? (255.255.
11条回答
  •  -上瘾入骨i
    2020-11-29 01:52

    this is my groovy's:)

    //IP calculator by ku1gun
    
    // input
    String inputAddr = "12.34.56.78/20";
    
    //magic
    def(String ipAddrBin, String maskAddrBin, String invertedMaskBin, int hostsCount) = getIpAddrAndCidrMaskBin(inputAddr);
    
    String broadcastAddr = retrieveBroadcastAddr(ipAddrBin, invertedMaskBin);
    String ipAddr = getTenBaseAddrValueFromBin(ipAddrBin);
    String maskAddr = getTenBaseAddrValueFromBin(maskAddrBin);
    String invertedMask = getTenBaseAddrValueFromBin(invertedMaskBin);
    String networkAddr = retrieveNetworkAddr(ipAddrBin, maskAddrBin);
    
    def (String ipMinVal, String ipMaxVal) = getMinMaxIpRangeValues(networkAddr, broadcastAddr)
    
    //Output "debug" results
    System.out.println("Variables:");
    System.out.println("ipInput: " + ipAddr);
    System.out.println("MaskInput: " + maskAddr);
    System.out.println("invertedMask: " + invertedMask);
    System.out.println("-----------------------");
    System.out.println("Binaries:");
    System.out.println("ipBin: " + ipAddrBin);
    System.out.println("MaskInBin: " + maskAddrBin);
    System.out.println("InvertedMaskBin: " + invertedMaskBin);
    System.out.println("-----------------------");
    System.out.println("Results:");
    System.out.println("maskAddr: " + maskAddr);
    System.out.println("hostsCount: " + hostsCount);
    System.out.println("networkAddr: " + networkAddr);
    System.out.println("broadcastAddr: " + broadcastAddr);
    System.out.println("ipMinVal: " + ipMinVal);
    System.out.println("ipMaxVal: " + ipMaxVal);
    System.out.println("-----------------------");
    System.out.println("IP range list:");
    
    long ipStart = host2long(ipMinVal);
    long ipEnd = host2long(ipMaxVal);
    
    
    for (long i=ipStart; i<=ipEnd; i++) 
    {
        System.out.println(long2dotted(i));
    }
    
    
    //general methods
    def getIpAddrAndCidrMaskBin(String inputAddrStr)
    {
        def netMask = "";
        def invNetMask = "";
    
        def cidrAddressList = inputAddrStr.tokenize("\\/")
        def baseIPAddress = cidrAddressList.first()
        def cidrIPMask = cidrAddressList.last().toInteger()
    
        //retrieve binaryNetMask and binaryInvertedNetMask
        for(i=0; i<32; i++)
        {
            if(i=0 ? addr[i] : 0)) << 8*(3-i);
        }
        return ip;
    }
    
    public static int[] ip2intarray(String host) 
    {
        Integer[] address = [-1,-1,-1,-1];
        int i=0;
        StringTokenizer tokens = new StringTokenizer(host,".");
        if (tokens.countTokens() > 4) return null;
        while (tokens.hasMoreTokens()) 
        {
            try 
            {
                address[i++] = Integer.parseInt(tokens.nextToken()) & 0xFF;
            } 
            catch(NumberFormatException nfe) 
            {
                return null;
            }
        }
        return address;
    }
    
    public static String long2dotted(long ip) 
    {
        // if ip is bigger than 255.255.255.255 or smaller than 0.0.0.0
        if (ip > 4294967295l || ip < 0) 
        {
            throw new IllegalArgumentException("invalid ip");
        }
        StringBuilder ipAddress = new StringBuilder();
        for (int i = 3; i >= 0; i--) {
            int shift = i * 8;
            ipAddress.append((ip & (0xff << shift)) >> shift);
            if (i > 0) {
                ipAddress.append(".");
            }
        }
        return ipAddress.toString();
    }
    

提交回复
热议问题