Java: convert int to InetAddress
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;
kdt
Updated on September 05, 2020Comments
-
kdt almost 4 years
I have an
int
which contains an IP address in network byte order, which I would like to convert to anInetAddress
object. I see that there is anInetAddress
constructor that takes abyte[]
, is it necessary to convert theint
to abyte[]
first, or is there another way?-
BalusC over 14 yearsCan 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 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 over 14 yearsRemember that, if you want to ever support IPv6, you can't use single int to handle IP addresses.
-
-
BalusC over 14 yearsHe 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 over 14 yearsThat 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 over 14 yearsI 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 over 14 yearswill 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 over 14 yearsSorry, 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 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 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 about 10 yearsThis is almost right, but you got the order of the bytes backwards: docs.oracle.com/javase/7/docs/api/java/net/…
-
toom over 8 yearsDangerous. Does not work, for instance for 0.0.0.0. Not reliable!
-
redbeam_ about 7 yearsthe link in your answer is broken
-
aij about 7 years@redbeam_ Updated.
-
Mr. Kevin Thomas over 6 yearsThis 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));