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