Converting CIDR address to subnet mask and network address

前端 未结 11 667
既然无缘
既然无缘 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条回答
  • 2020-11-29 01:48
    --plsql ip_calc by ku1gun
    with a as
    (
    select
      '12.34.56.78/20' ip
    from dual
    ),b as
    (
    select
      utl_raw.concat(utl_raw.substr(utl_raw.cast_from_binary_integer(to_number(regexp_substr(ip,'[^.]+',1,1)),2),1,1),utl_raw.substr(utl_raw.cast_from_binary_integer(to_number(regexp_substr(ip,'[^.]+',1,2)),2),1,1),utl_raw.substr(utl_raw.cast_from_binary_integer(to_number(regexp_substr(ip,'[^.]+',1,3)),2),1,1),utl_raw.substr(utl_raw.cast_from_binary_integer(to_number(regexp_substr(replace(ip,'/','.'),'[^.]+',1,4)),2),1,1)) ip,
      utl_raw.cast_from_binary_integer(power(2,32-to_number(regexp_substr(ip,'[^/]+',1,2)))-1) wildcard,
      utl_raw.bit_xor(utl_raw.cast_from_binary_integer(-1),utl_raw.cast_from_binary_integer(power(2,32-to_number(regexp_substr(ip,'[^/]+',1,2)))-1)) mask
    from a
    ),c as
    (
    select
      utl_raw.bit_and(ip,mask) network_address,
      utl_raw.bit_or(utl_raw.bit_and(ip,mask),wildcard) broadcast_address,
      utl_raw.cast_from_binary_integer(utl_raw.cast_to_binary_integer(utl_raw.bit_and(ip,mask))+1) first_adress,
      utl_raw.cast_from_binary_integer(utl_raw.cast_to_binary_integer(utl_raw.bit_or(utl_raw.bit_and(ip,mask),wildcard))-1) last_adress,
      utl_raw.cast_from_binary_integer(utl_raw.cast_to_binary_integer(utl_raw.bit_and(ip,mask))+level) ip_address
    from b
    connect by level<utl_raw.cast_to_binary_integer(utl_raw.bit_or(utl_raw.bit_and(ip,mask),wildcard))-utl_raw.cast_to_binary_integer(utl_raw.bit_and(ip,mask))
    )
    select
      to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(network_address,1,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(network_address,2,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(network_address,3,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(network_address,4,1))) network_address,
      to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(broadcast_address,1,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(broadcast_address,2,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(broadcast_address,3,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(broadcast_address,4,1))) broadcast_address,
      to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(first_adress,1,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(first_adress,2,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(first_adress,3,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(first_adress,4,1))) first_adress,
      to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(last_adress,1,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(last_adress,2,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(last_adress,3,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(last_adress,4,1))) last_adress,
      to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(ip_address,1,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(ip_address,2,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(ip_address,3,1)))||'.'||to_char(utl_raw.cast_to_binary_integer(utl_raw.substr(ip_address,4,1))) ip_address
    from c
    ;
    
    0 讨论(0)
  • 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<cidrIPMask)
            {
                netMask = netMask + "1";
                invNetMask = invNetMask + "0";
            }
            else
            {
                netMask = netMask + "0";
                invNetMask = invNetMask + "1";
            }
        }
    
        //retrieve binaryIpAddress
        String[] addrOctetArray = baseIPAddress.split("\\.");
        String binAddr = "";
        for (String string : addrOctetArray)
            {
                int octet = Integer.parseInt(string);     
                String binaryOctet = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0');
                binAddr = binAddr + binaryOctet;
            }
    
        hostsCount = 2**(32 - cidrIPMask) - 2;
    
        return [binAddr, netMask, invNetMask, hostsCount]
    }
    
    def getTenBaseAddrValueFromBin(String binVal)
    {
        tenBaseAddr = "";
        tenBaseAddr = tenBaseAddr + Integer.parseInt(binVal.substring(0,8), 2) + "." + Integer.parseInt(binVal.substring(8,16), 2) + "." + Integer.parseInt(binVal.substring(16,24), 2) + "." + Integer.parseInt(binVal.substring(24,32), 2)
        return tenBaseAddr;
    }
    
    def retrieveBroadcastAddr(String ipAddrBin, String invertedMaskBin)
    {
        def oct_1 = Integer.parseInt(ipAddrBin.substring(0,8), 2) | Integer.parseInt(invertedMaskBin.substring(0,8), 2);
        def oct_2 = Integer.parseInt(ipAddrBin.substring(8,16), 2) | Integer.parseInt(invertedMaskBin.substring(8,16), 2);
        def oct_3 = Integer.parseInt(ipAddrBin.substring(16,24), 2) | Integer.parseInt(invertedMaskBin.substring(16,24), 2);
        def oct_4 = Integer.parseInt(ipAddrBin.substring(24,32), 2) | Integer.parseInt(invertedMaskBin.substring(24,32), 2);
    
        def t_oct = oct_1 + "."+ oct_2 + "." +  oct_3 + "." + oct_4;
        return t_oct
    }
    
    def retrieveNetworkAddr(String ipAddrBin, String maskInBin)
    {
        def oct_1 = Integer.parseInt(ipAddrBin.substring(0,8), 2) & Integer.parseInt(maskInBin.substring(0,8), 2);
        def oct_2 = Integer.parseInt(ipAddrBin.substring(8,16), 2) & Integer.parseInt(maskInBin.substring(8,16), 2);
        def oct_3 = Integer.parseInt(ipAddrBin.substring(16,24), 2) & Integer.parseInt(maskInBin.substring(16,24), 2);
        def oct_4 = Integer.parseInt(ipAddrBin.substring(24,32), 2) & Integer.parseInt(maskInBin.substring(24,32), 2);
    
        def t_oct = oct_1 + "."+ oct_2 + "." +  oct_3 + "." + oct_4;
        return t_oct
    }
    
    def getMinMaxIpRangeValues(networkAddr, broadcastAddr)
    {
        String[] ipAddrOctetArray = networkAddr.split("\\.");
        String[] broadcastOctetArray = broadcastAddr.split("\\.");
    
        String minRangeVal = ipAddrOctetArray[0] + "." + ipAddrOctetArray[1] + "." + ipAddrOctetArray[2] + "." + (Integer.parseInt(ipAddrOctetArray[3]) + 1)
        String maxRangeVal = broadcastOctetArray[0] + "." +broadcastOctetArray[1] + "." +broadcastOctetArray[2] + "." + (Integer.parseInt(broadcastOctetArray[3]) - 1)
    
        return[minRangeVal, maxRangeVal]
    }
    
    //IP list generate
    public static long host2long(String host) 
    {
        long ip=0;
        if (!Character.isDigit(host.charAt(0))) return -1;
        int[] addr = ip2intarray(host);
        if (addr == null) return -1;
        for (int i=0;i<addr.length;++i) 
        {
            ip += ((long)(addr[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();
    }
    
    0 讨论(0)
  • 2020-11-29 01:52

    Apache Java class SubnetUtils offers help to do some of this:

    String[] parts = ipv4Cidr.split("/");
    if (parts[1].equals("0"))
    {
        // This accepts all ip addresses.  Technically not a subnet.
        maskLength = 0;
        maskAdress = "0.0.0.0"
    }
    else
    {
         maskLength = Integer.parseInt(parts[1]);
         cidrInfo = new SubnetUtils(ipv4Cidr).getInfo();
         maskAdress = cidrInfo.asInteger(cidrInfo.getNetmask());
         networkAddress = cidrInfo.getNetworkAddress()
    }
    
    0 讨论(0)
  • 2020-11-29 01:53

    It is covered by apache utils.

    See this URL: http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/util/SubnetUtils.html

    String subnet = "192.168.0.3/31";
    SubnetUtils utils = new SubnetUtils(subnet);
    
    utils.getInfo().isInRange(address)
    

    Note: For use w/ /32 CIDR subnets, for exemple, one needs to add the following declaration :

    utils.setInclusiveHostCount(true);
    
    0 讨论(0)
  • 2020-11-29 01:53

    Linux command line ipcalc. You can quickly use :

    $ipcalc 192.168.10.0/24
    Address:   192.168.10.0         11000000.10101000.00001010. 00000000
    Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
    Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
    =>
    Network:   192.168.10.0/24      11000000.10101000.00001010. 00000000
    HostMin:   192.168.10.1         11000000.10101000.00001010. 00000001
    HostMax:   192.168.10.254       11000000.10101000.00001010. 11111110
    Broadcast: 192.168.10.255       11000000.10101000.00001010. 11111111
    Hosts/Net: 254                   Class C, Private Internet
    
    0 讨论(0)
提交回复
热议问题