У меня есть int
, который содержит IP-адрес в сетевом порядке байтов, который я хотел бы преобразовать в объект InetAddress
. Я вижу, что существует конструктор InetAddress
, который принимает byte[]
, необходимо ли сначала преобразовать int
в byte[]
, или есть другой способ?
Java: преобразование int в InetAddress
Ответ 1
Это должно работать:
int ipAddress = ....
byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
InetAddress address = InetAddress.getByAddress(bytes);
Возможно, вам придется поменять порядок байтового массива, я не могу понять, будет ли массив генерироваться в правильном порядке.
Ответ 2
Протестировано и работает:
int ip = ... ;
String ipStr =
String.format("%d.%d.%d.%d",
(ip & 0xff),
(ip >> 8 & 0xff),
(ip >> 16 & 0xff),
(ip >> 24 & 0xff));
Ответ 3
Я думаю, что этот код проще:
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;
}
}
Ответ 4
Если вы используете библиотеки Google Guava, InetAddresses.fromInteger
делает именно то, что вы хотите. Api docs здесь
Если вы предпочитаете писать свою собственную функцию преобразования, вы можете сделать что-то вроде того, что предлагает @aalmeida, за исключением того, что вы должны поместить байты в правильном порядке (сначала старший байт).
Ответ 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;
}
эту функцию можно использовать для преобразования int в байты;
Ответ 6
Недостаточно репутации, чтобы комментировать ответ skaffman, поэтому я добавлю это как отдельный ответ.
Решение skaffman предлагает правильное решение с одним исключением. BigInteger.toByteArray() возвращает массив байтов, который может иметь старший бит знака.
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 выше кода использует ArrayUtils из Apache Commons Lang.
Ответ 7
Использование Google Guava:
byte [] bytes = Ints.toByteArray(ipAddress);
Адрес InetAddress = InetAddress.getByAddress(байты);
Ответ 8
Это может работать.
public static String intToIp(int i) {
return ((i >> 24 ) & 0xFF) + "." +
((i >> 16 ) & 0xFF) + "." +
((i >> 8 ) & 0xFF) + "." +
( i & 0xFF);
}
Ответ 9
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);
}