vlsm una tabla subredes subred subneteo mascaras mascara direcciones clase calculo calculadora java networking ip mask cidr

java - una - Conversión de dirección CIDR en máscara de subred y dirección de red



tabla de mascaras de red (11)

Aquí hay un ejemplo simple de Groovy

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]

Dada una dirección CIDR, por ejemplo, 192.168.10.0/24

  • ¿Cómo determinar la longitud de la máscara? ( 24 )
  • ¿Cómo determinar la dirección de la máscara? ( 255.255.255.0 )
  • Cómo determinar la dirección de red? ( 192.168.10.0 )

Así es como lo harías en 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());


Clase de Apache Java SubnetUtils ofrece ayuda para hacer algo de esto:

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() }


El algoritmo está en pseudo código (en realidad PHP), puede traducirlo a Java usted mismo.
Algoritmo desde 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



Línea de comando de Linux ipcalc. Puede usar rápidamente:

$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


Puede usar org.springframework.security.web.util.IpAddressMatcher desde Spring Framework.


Siguiendo la respuesta de Yuriy: Para obtener todo el rango de direcciones IP, la clase Apache Java SubnetUtils ofrece los siguientes métodos:

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

Para descargar el jar que contiene la clase, vaya a: http://repo1.maven.org/maven2/commons-net/commons-net/3.0.1/commons-net-3.0.1.jar

El código fuente: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/util/SubnetUtils.java?view=markup

Identificación de Maven:

<groupId>commons-net<groupId> <artifactId>commons-net<artifactId> <version>3.0.1<version>


este es mi maravilloso :)

//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(); }


La biblioteca IPAddress Java admite tanto IPv4 como IPv6 de forma polimórfica, incluidas las subredes. El javadoc está disponible en el enlace. Descargo de responsabilidad: soy el gerente del proyecto.

Todos los casos de uso enumerados son compatibles tanto para IPv4 como para Ipv6 de forma transparente.

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 }


--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 ;