Given a CIDR address, e.g. 192.168.10.0/24
24
)255.255.
--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
;
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();
}
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()
}
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);
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