Indo de 127.0.0.1 a 2130706433, e de volta

Usando as bibliotecas Java padrão, qual é a maneira mais rápida de obter da representação de cadeia pontilhada de um endereço IPV4 ( "127.0.0.1" ) para a representação de número inteiro equivalente ( 2130706433 ).

E correspondentemente, qual é a maneira mais rápida de inverter essa operação – indo do inteiro 2130706433 para a representação de string "127.0.0.1" ?

String para int:

 int pack(byte[] bytes) { int val = 0; for (int i = 0; i < bytes.length; i++) { val <<= 8; val |= bytes[i] & 0xff; } return val; } pack(InetAddress.getByName(dottedString).getAddress()); 

Int para string:

 byte[] unpack(int bytes) { return new byte[] { (byte)((bytes >>> 24) & 0xff), (byte)((bytes >>> 16) & 0xff), (byte)((bytes >>> 8) & 0xff), (byte)((bytes ) & 0xff) }; } InetAddress.getByAddress(unpack(packedBytes)).getHostAddress() 

Você também pode usar a class InetAddress do Google Guava

 String ip = "192.168.0.1"; InetAddress addr = InetAddresses.forString(ip); // Convert to int int address = InetAddresses.coerceToInteger(addr); // Back to str String addressStr = InetAddresses.fromInteger(address)); 

Eu modifiquei minha resposta original. Na implementação de InetAddress da Sun, o método hashCode produz a representação inteira do endereço IPv4, mas como os comentaristas corretamente apontaram, isso não é garantido pelo JavaDoc. Portanto, decidi usar a class ByteBuffer para calcular o valor do endereço IPv4.

 import java.net.InetAddress; import java.nio.ByteBuffer; // ... try { // Convert from integer to an IPv4 address InetAddress foo = InetAddress.getByName("2130706433"); String address = foo.getHostAddress(); System.out.println(address); // Convert from an IPv4 address to an integer InetAddress bar = InetAddress.getByName("127.0.0.1"); int value = ByteBuffer.wrap(bar.getAddress()).getInt(); System.out.println(value); } catch (Exception e) { e.printStackTrace(); } 

A saída será:

 127.0.0.1 2130706433 

Caso você precise aprender matemática, você pode usar Substr para extrair os octetos. Mutliply o primeiro octeto significando a class por (256 * 256 * 256) ou (2 ^ 24) segundo multiplicado por (256 * 256) (2 ^ 16) terceiro multiplicado por (256) (2 ^ 8) quarto multiplicado por 1 ou (2 ^ 0)

127 * (2 ^ 24) + 0 * (2 ^ 16) + 0 * (2 ^ 8) + 1 * (2 ^ 0) 2130706432 + 0 + 0 + 1 = 2130706433

Eu não tentei isso. desempenho, mas a maneira mais simples é provavelmente usar o ByteBuffer NIO.

por exemplo

  byteBuffer.put(integer).array(); 

retornaria uma matriz de bytes representando o inteiro. Você pode precisar modificar a ordem de bytes.

Usando a biblioteca Java IPAddress é simples, uma linha de código para cada direção. Disclaimer: Eu sou o gerente de projetos dessa biblioteca.

  IPv4Address loopback = new IPAddressString("127.0.0.1").getAddress().toIPv4(); System.out.println(loopback.intValue()); IPv4Address backAgain = new IPv4Address(loopback.intValue()); System.out.println(backAgain); 

Saída:

  2130706433 127.0.0.1 

Outra maneira:

 public static long ipToLong(String ipAddress) { String[] ipAddressInArray = ipAddress.split("\\."); long result = 0; for (int i = 0; i < ipAddressInArray.length; i++) { int power = 3 - i; int ip = Integer.parseInt(ipAddressInArray[i]); result += ip * Math.pow(256, power); } return result; }