Пользование стандартными библиотеками Java, что самый быстрый путь состоит в том, чтобы получить от точечного строкового представления адресного IPV4 ("127.0.0.1"
) к эквивалентному целочисленному представлению (2130706433
).
И соответственно, то, что состоит в том, чтобы инвертировать самый быстрый путь, сказало что операция - идущий от целого числа 2130706433
к строковому представлению"127.0.0.1"
?
Строка в int:
int pack(byte[] bytes) {
int val = 0;
for (int i = 0; i < bytes.length; i++) {
val <<= 8;
val |= bytes[i] & 0xff;
}
return val;
}
pack(InetAddress.getByName(dottedString).getAddress());
Int в строку:
byte[] unpack(int bytes) {
return new byte[] {
(byte)((bytes >>> 24) & 0xff),
(byte)((bytes >>> 16) & 0xff),
(byte)((bytes >>> 8) & 0xff),
(byte)((bytes ) & 0xff)
};
}
InetAddress.getByAddress(unpack(packedBytes)).getHostAddress()
Я изменил свой первоначальный ответ. В реализации InetAddress
от Sun метод hashCode
производит целочисленное представление IPv4-адреса, но, как правильно указали комментаторы, это не гарантируется JavaDoc. Поэтому я решил использовать класс ByteBuffer
для вычисления значения IPv4-адреса.
import java.net.InetAddress;
import java.nio.ByteBuffer;
// ...
try {
// Convert from integer to an IPv4 address
InetAddress foo = InetAddress.getByName("2130706433");
String address = foo.getHostAddress();
System.out.println(address);
// Convert from an IPv4 address to an integer
InetAddress bar = InetAddress.getByName("127.0.0.1");
int value = ByteBuffer.wrap(bar.getAddress()).getInt();
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
На выходе получится:
127.0.0.1
2130706433
Не пробовал. производительность, но самый простой способ - это использовать NIO ByteBuffer .
например.
byteBuffer.put(integer).array();
вернет вам массив байтов, представляющий целое число. Вам может потребоваться изменить порядок байтов.