inet4address example create java inetaddress

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;