Converting CIDR address to subnet mask and network address
Asked Answered
W

11

46

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

  • How to determine mask length? (24)
  • How to determine mask address? (255.255.255.0)
  • How to determine network address? (192.168.10.0)
Wrapper answered 31/5, 2010 at 8:29 Comment(0)
B
71

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);
Bookcase answered 28/7, 2011 at 11:48 Comment(4)
it seems the utility have a problem with just one address notification. I mean; let's say the ip is just one ip. so if I want to use it like ip/32 than it fails. or I am using it in the wrong way.Muskogean
@OlgunKaya you are using it in the wrong way, the constructor showed in the answer expects CIDR notation, it is IP_address/MASK not only IP_address.Adenoma
getNetmask() returns the SubnetMask (255.255.255.0). If I want to get prefix length (24), is there any method? I couldn't findSweptwing
SubnetUtils does not support IPv6, how to achieve the same for ipv6?Citronella
G
31

This is how you would do it in Java,

    String[] parts = addr.split("/");
    String ip = parts[0];
    int prefix;
    if (parts.length < 2) {
        prefix = 0;
    } else {
        prefix = Integer.parseInt(parts[1]);
    }
    int mask = 0xffffffff << (32 - prefix);
    System.out.println("Prefix=" + prefix);
    System.out.println("Address=" + ip);

    int value = mask;
    byte[] bytes = new byte[]{ 
            (byte)(value >>> 24), (byte)(value >> 16 & 0xff), (byte)(value >> 8 & 0xff), (byte)(value & 0xff) };

    InetAddress netAddr = InetAddress.getByAddress(bytes);
    System.out.println("Mask=" + netAddr.getHostAddress());
Glazier answered 31/5, 2010 at 15:16 Comment(1)
/*** approximation in javascript. since i needed this for myself, i may as well share ***/ function cidrToMask ( cidrStr ) { var parts = cidrStr.split('/'); var ipStr = parts[0]; var prefix = (parts.length < 1) ? 0 : Number( parts[1] ); var mask = 0xffffffff << (32 - prefix); var maskStr = [ (mask >>> 24) , (mask >> 16 & 0xff) , (mask >> 8 & 0xff) , (mask & 0xff) ].join('.'); alert( "Prefix=" + prefix + "\n" + "Address=" + ipStr + "\n" + "Mask=" + maskStr ); }; cidrToMask ( '192.168.10.0/24' );Insensibility
I
11

The IPAddress Java library supports both IPv4 and IPv6 in a polymorphic manner including subnets. The javadoc is available at the link. Disclaimer: I am the project manager.

All the use cases you listed are supported for both IPv4 and Ipv6 transparently.

    String str = "192.168.10.0/24";
    IPAddressString addrString = new IPAddressString(str);
    try {
         IPAddress addr = addrString.toAddress();
         Integer prefix = addr.getNetworkPrefixLength(); //24
         IPAddress mask = addr.getNetwork().getNetworkMask(prefix, false);//255.255.255.0
         IPAddress networkAddr = addr.mask(mask);  //192.168.10.0
         IPAddress networkAddrOtherWay = addr.getLower().removePrefixLength(); //192.168.10.0

         ...
    } catch(AddressStringException e) {
        //e.getMessage provides validation issue
    }
Iceman answered 17/10, 2016 at 6:46 Comment(9)
Is this available as a Maven dependency?Ledoux
it will be shortly, I will update the project page when it isIceman
now it is, it is now in maven central repo: repo1.maven.org/maven2/com/github/seancfoley/ipaddress/2.0.0Iceman
Ive read the docs, Ive experimented ... is there an easy way to get - for example - an array of all pingable IP addresses from say ... your subnet class? Or do I have to re-construct the addresses from the lower and upper address?Poll
Well, you can only tell if an address is pingable by getting that address and pinging it. So you'd have to try pinging each one. To get each address you could just iterate through the subnet: for(IPAddress addr : new IPAddressString("192.168.10.0/24").getAddress()) { ... }Iceman
@SeanF I was hoping there was some fancy-dancy class out there that did the work for me ... ;-)Poll
@MichaelSims and your hopes were answered :-)Iceman
@SeanF Actually, I had to do it like this: for(IPAddress addr: new IPAddressString("10.10.10.0/24").toSequentialRange().getIterable()){ ... } - But it worked, except for I had to figure out how to isolate the .0 address from my .isReachable because Java says I don't have permission to ping the network address ... go figure :-)Poll
Nice job! Well thought out comprehensive way for dealing with ipv4 and ipv6 addressesEstren
W
7

Following Yuriy's answer: To get the whole range of ip addresses, the Apache Java class SubnetUtils offers the following methods:

String[] addresses = utils.getInfo().getAllAddresses();

To download the jar containing the class go to: http://repo1.maven.org/maven2/commons-net/commons-net/3.0.1/commons-net-3.0.1.jar

The source code: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/util/SubnetUtils.java?view=markup

Maven id:

<groupId>commons-net<groupId>
<artifactId>commons-net<artifactId>
<version>3.0.1<version>
Wicked answered 29/9, 2011 at 7:42 Comment(0)
S
6

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
Siu answered 2/5, 2017 at 20:41 Comment(1)
macos: brew install ipcalcRaceway
I
2

The algorithm is in pseudo code (actually PHP), you can translate it to java yourself.
Algoritm from here.

//$ipNetmask = "192.168.1.12/30";
list($ip, $netmask) = split( "/", $ipNetmask );
$ip_elements_decimal = split( "[.]", $ip );
$netmask_result="";
for($i=1; $i <= $netmask; $i++) {
  $netmask_result .= "1";
}
for($i=$netmask+1; $i <= 32; $i++) {
    $netmask_result .= "0";
}
$netmask_ip_binary_array = str_split( $netmask_result, 8 );
$netmask_ip_decimal_array = array();
foreach( $netmask_ip_binary_array as $k => $v ){
    $netmask_ip_decimal_array[$k] = bindec( $v ); // "100" => 4
    $network_address_array[$k] = ( $netmask_ip_decimal_array[$k] & $ip_elements_decimal[$k] );
}
$network_address = join( ".", $network_address_array );

// ------------------------------------------------
           // TCP/IP NETWORK INFORMATION
// ------------------------------------------------
// IP Entered = ..................: 192.168.1.12
// CIDR = ........................: /30
// Netmask = .....................: 255.255.255.252
// Network Address = .............: 192.168.1.12

// Broadcast Address = ...........: 192.168.1.15
// Usable IP Addresses = .........: 2
// First Usable IP Address = .....: 192.168.1.13
// Last Usable IP Address = ......: 192.168.1.14
Intolerable answered 31/5, 2010 at 8:52 Comment(0)
P
1

You can use org.springframework.security.web.util.IpAddressMatcher from Spring Framework.

Pantywaist answered 18/1, 2012 at 14:17 Comment(1)
github.com/edazdarevic/CIDRUtils gives you IPv6 support and a test to see if an IP address is in the range or not. Mask length is missing though. See this answer #558538Prestigious
K
1

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();
}
Kahler answered 29/2, 2016 at 7:58 Comment(1)
this is mostly ugly Java code with just a couple of "def"s. In proper Groovy this would be half the size.Sightread
O
0

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()
}
Ontology answered 11/5, 2015 at 14:18 Comment(0)
G
0

Here is a simple Groovy example

def cidrAddress = '192.168.10.0/24'
def cidrAddressList = cidrAddress.tokenize("\\/")
def baseIPAddress = cidrAddressList.first()
def cidrIPMask = cidrAddressList.last().toInteger()
def netMaskList = []
Integer fullOctets = cidrIPMask.intdiv(8)
fullOctets.times {netMaskList.add('255')}
def remainder = cidrIPMask % 8
netMaskList.add((256 - (2 ** (8 - remainder))).toString())
netMaskList.addAll(['0','0','0','0'])
def netMask = netMaskList.flatten().getAt(0..3).join('.')
return [cidrAddress,baseIPAddress,cidrIPMask,netMask]
Garneau answered 13/1, 2016 at 11:20 Comment(0)
K
-1
--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
;
Kahler answered 19/4, 2016 at 13:42 Comment(1)
Welcome. You could improve this answer by explaining how it solves the problem posed in the question.Arthromere

© 2022 - 2024 — McMap. All rights reserved.