Java: convert int to InetAddress

37,175

Solution 1

This should work:

int ipAddress = ....
byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
InetAddress address = InetAddress.getByAddress(bytes);

You might have to swap the order of the byte array, I can't figure out if the array will be generated in the correct order.

Solution 2

Tested and working:

int ip  = ... ;
String ipStr = 
  String.format("%d.%d.%d.%d",
         (ip & 0xff),   
         (ip >> 8 & 0xff),             
         (ip >> 16 & 0xff),    
         (ip >> 24 & 0xff));

Solution 3

I think that this code is simpler:

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

Solution 4

If you're using Google's Guava libraries, InetAddresses.fromInteger does exactly what you want. Api docs are here

If you'd rather write your own conversion function, you can do something like what @aalmeida suggests, except be sure to put the bytes in the right order (most significant byte first).

Solution 5

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;

}

you can use this function to turn int to bytes;

Share:
37,175
kdt
Author by

kdt

Updated on September 05, 2020

Comments

  • kdt
    kdt almost 4 years

    I have an int which contains an IP address in network byte order, which I would like to convert to an InetAddress object. I see that there is an InetAddress constructor that takes a byte[], is it necessary to convert the int to a byte[] first, or is there another way?

    • BalusC
      BalusC over 14 years
      Can you post an example how this int look like and how its string representation should look like? I can't imagine how to put 255255255255 in an int, it would overflow.
    • skaffman
      skaffman over 14 years
      @BalusC: A IPv4 address is just a 32 bit number, it's just that it's usually represented as 4 8-bit values. The information fits just fine in 32 bits, though.
    • iny
      iny over 14 years
      Remember that, if you want to ever support IPv6, you can't use single int to handle IP addresses.
  • BalusC
    BalusC over 14 years
    He was asking for int-to-bytearray, not int-to-string. Also your words "this may work try" makes me think that you just googled blind and copypasted random function? Why?
  • kdt
    kdt over 14 years
    That does indeed still require swapping the order of the byte array. However, it turns out my input was actually in host order after all! Thanks.
  • user85421
    user85421 over 14 years
    I don't think an additional leading sign bit will be a problem, but missing bytes if the address is in the range 0.0.0.0 - 0.127.255.255 and 255.128.0.0 - 255.255.255.255
  • user85421
    user85421 over 14 years
    will not work for addresses in the range 0.0.0.0 - 0.127.255.255 and 255.128.0.0 - 255.255.255.255: bytes will have less than 4 elements
  • Dennis Laumen
    Dennis Laumen over 14 years
    Sorry, I'm not an expert in this field. Could you elaborate on your comment? I'm afraid I'm missing the point (and could potentially have a bug in my code ;) ).
  • aij
    aij about 10 years
    @NikolayKuznetsov Because those ranges would result in a byte array of size 3 or less, whereas InetAddress requires the array to be of size 4 or 16.
  • aij
    aij about 10 years
    @DennisLaumen You do. Try for example, 0, 42, or -42. You should get 0.0.0.0, 0.0.0.42, and 255.255.255.214. Instead you'll get an exception. See also en.wikipedia.org/wiki/Twos_complement
  • aij
    aij about 10 years
    This is almost right, but you got the order of the bytes backwards: docs.oracle.com/javase/7/docs/api/java/net/…
  • toom
    toom over 8 years
    Dangerous. Does not work, for instance for 0.0.0.0. Not reliable!
  • redbeam_
    redbeam_ about 7 years
    the link in your answer is broken
  • aij
    aij about 7 years
    @redbeam_ Updated.
  • Mr. Kevin Thomas
    Mr. Kevin Thomas over 6 years
    This converts the bytes in the wrong order. It would work for little-endian ints, but the question asked about "network byte order" which is big-endian as are ints in Java. The correct order is: String.format("%d.%d.%d.%d", (ip >> 24 & 0xff), (ip >> 16 & 0xff), (ip >> 8 & 0xff), (ip & 0xff));