Я имею int
который содержит IP-адрес в сетевом порядке байтов, который я хотел бы преобразовать в InetAddress
объект. Я вижу, что существует InetAddress
конструктор, который берет a byte[]
, действительно ли необходимо преобразовать int
к a byte[]
во-первых, или есть ли иначе?
Это должно сработать:
int ipAddress = ....
byte[] bytes = BigInteger.valueOf(ipAddress).toByteArray();
InetAddress address = InetAddress.getByAddress(bytes);
Возможно, придется поменять порядок следования байтового массива, я не могу понять, будет ли массив сгенерирован в правильном порядке
.Может сработать попытка
public static String intToIp(int i) {
return ((i >> 24 ) & 0xFF) + "." +
((i >> 16 ) & 0xFF) + "." +
((i >> 8 ) & 0xFF) + "." +
( i & 0xFF);
}
Недостаточно репутации, чтобы комментировать ответ 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);
Приведенный выше код использует ArrayUtils из Apache Commons Lang.