example - Java: convertir int a InetAddress
inetaddress java example (9)
Creo que este código es más sencillo:
static public byte[] toIPByteArray(int addr){
return new byte[]{(byte)addr,(byte)(addr>>>8),(byte)(addr>>>16),(byte)(addr>>>24)};
}
static public InetAddress toInetAddress(int addr){
try {
return InetAddress.getByAddress(toIPByteArray(addr));
} catch (UnknownHostException e) {
//should never happen
return null;
}
}
Tengo un int
que contiene una dirección IP en orden de bytes de red, que me gustaría convertir en un objeto InetAddress
. Veo que hay un constructor InetAddress
que toma un byte[]
, ¿es necesario convertir el int
en un byte[]
primero, o hay otra forma?
Esto debería funcionar:
int ipAddress = ....
byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
InetAddress address = InetAddress.getByAddress(bytes);
Es posible que tenga que cambiar el orden de la matriz de bytes, no puedo averiguar si la matriz se generará en el orden correcto.
Esto puede funcionar intente
public static String intToIp(int i) {
return ((i >> 24 ) & 0xFF) + "." +
((i >> 16 ) & 0xFF) + "." +
((i >> 8 ) & 0xFF) + "." +
( i & 0xFF);
}
No tengo suficiente reputación para comentar sobre la respuesta de Skaffman, así que agregaré esto como una respuesta por separado.
La solución que propone Skaffman es correcta con una excepción. BigInteger.toByteArray () devuelve una matriz de bytes que podría tener un bit de signo inicial.
byte[] bytes = bigInteger.toByteArray();
byte[] inetAddressBytes;
// Should be 4 (IPv4) or 16 (IPv6) bytes long
if (bytes.length == 5 || bytes.length == 17) {
// Remove byte with most significant bit.
inetAddressBytes = ArrayUtils.remove(bytes, 0);
} else {
inetAddressBytes = bytes;
}
InetAddress address = InetAddress.getByAddress(inetAddressBytes);
PS: el código anterior utiliza ArrayUtils de Apache Commons Lang.
Probado y funcionando:
int ip = ... ;
String ipStr =
String.format("%d.%d.%d.%d",
(ip & 0xff),
(ip >> 8 & 0xff),
(ip >> 16 & 0xff),
(ip >> 24 & 0xff));
Si está utilizando las bibliotecas de guayaba de Google, InetAddresses.fromInteger
hace exactamente lo que quiere. Api docs están here
Si prefiere escribir su propia función de conversión, puede hacer algo como lo que sugiere @aalmeida, excepto asegurarse de colocar los bytes en el orden correcto (el byte más significativo primero).
Utilizando Google Guava:
byte [] bytes = Ints.toByteArray (ipAddress);
InetAddress address = InetAddress.getByAddress (bytes);
public InetAddress intToInetAddress(Integer value) throws UnknownHostException
{
ByteBuffer buffer = ByteBuffer.allocate(32);
buffer.putInt(value);
buffer.position(0);
byte[] bytes = new byte[4];
buffer.get(bytes);
return InetAddress.getByAddress(bytes);
}
public static byte[] int32toBytes(int hex) {
byte[] b = new byte[4];
b[0] = (byte) ((hex & 0xFF000000) >> 24);
b[1] = (byte) ((hex & 0x00FF0000) >> 16);
b[2] = (byte) ((hex & 0x0000FF00) >> 8);
b[3] = (byte) (hex & 0x000000FF);
return b;
}
puede utilizar esta función para convertir int a bytes;