java - code - Pasando de 127.0.0.1 a 2130706433, y viceversa.
java get hostname (7)
Cadena a 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 a la cadena:
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()
Al usar las bibliotecas Java estándar, ¿cuál es la forma más rápida de obtener la representación de cadena punteada de una dirección IPV4 ( "127.0.0.1"
) a la representación de enteros equivalente ( 2130706433
)?
Y, de manera correspondiente, ¿cuál es la forma más rápida de invertir dicha operación, yendo del número entero 2130706433
a la representación de cadena "127.0.0.1"
?
En caso de que necesite aprender la matemática de la mano larga, puede usar Substr para extraer los octetos. Mutliply el primer octeto que significa la Clase por (256 * 256 * 256) o (2 ^ 24) segundo multiplicado por (256 * 256) (2 ^ 16) tercero multiplicado por (256) (2 ^ 8) cuarto multiplicado por 1 o (2 ^ 0)
127 * (2 ^ 24) + 0 * (2 ^ 16) + 0 * (2 ^ 8) + 1 * (2 ^ 0) 2130706432 + 0 + 0 + 1 = 2130706433
He modificado mi respuesta original. En la implementación de InetAddress
de Sun, el método hashCode
produce la representación entera de la dirección IPv4, pero como los comentaristas señalaron correctamente, esto no está garantizado por el JavaDoc. Por lo tanto, decidí usar la clase ByteBuffer
para calcular el valor de la dirección IPv4 en su lugar.
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();
}
La salida será:
127.0.0.1
2130706433
No lo he intentado wrt. rendimiento, pero la forma más sencilla es probablemente usar el ByteBuffer NIO.
p.ej
byteBuffer.put(integer).array();
le devolvería una matriz de bytes que representa el entero. Es posible que necesite modificar el orden de bytes.
También puede utilizar la clase InetAddress de 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));
Usar la biblioteca Java de IPAddress es simple, una línea de código para cada dirección. Descargo de responsabilidad: Soy el administrador de proyectos de esa 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);
Salida:
2130706433
127.0.0.1
De otra manera:
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;
}