我使用Java(與Spring框架)並且想要在IPv4地址的數字表示(例如2130706433)和它們的文本對應物(例如127.0.0.1
)之間進行轉換。通常,用編程語言提供的方法(通常分別稱爲INET_NTOA
和INET_ATON
),但我無法在Java中找到它。Java中的INET_NTOA和INET_ATON?
有人知道他們叫什麼或如何實現它們?
我使用Java(與Spring框架)並且想要在IPv4地址的數字表示(例如2130706433)和它們的文本對應物(例如127.0.0.1
)之間進行轉換。通常,用編程語言提供的方法(通常分別稱爲INET_NTOA
和INET_ATON
),但我無法在Java中找到它。Java中的INET_NTOA和INET_ATON?
有人知道他們叫什麼或如何實現它們?
中只看的javadoc InetAddress。這些功能不是直接由標準API支持,但可以使用此類提取兩個表示。 一個小例子:
InetAddress address = InetAddress.getLocalHost();
byte[] byteAddress = address.getAddress();
System.out.println(Arrays.toString(byteAddress));
System.out.println(address.getHostAddress());
(請記住,字節簽名。)
如果你有長-S比喲可以使用ByteBuffer,快速,舒適的丁文。方法:putLong()然後是array()。
我猜InetAddress會做你想要
java.net.InetAddress.getByAddress(byte[])
不完全一樣INET_NTOA,但非常相似的東西。
實施例具有長參數:
String ntoa(long raw) {
byte[] b = new byte[] {(byte)(raw >> 24), (byte)(raw >> 16), (byte)(raw >> 8), (byte)raw};
try {
return InetAddress.getByAddress(b).getHostAddress();
} catch (UnknownHostException e) {
//No way here
return null;
}
}
這就是我寫我自己得到一個文本IPv4地址的數字表示:
public static Long ipAsNumeric(String ipAsString) {
String[] segments = ipAsString.split("\\.");
return (long) (Long.parseLong(segments[0]) * 16777216L
+ Long.parseLong(segments[1]) * 65536L
+ Long.parseLong(segments[2]) * 256L +
Long.parseLong(segments[3]));
}
。當然,這是假設的IPv4地址上的有效形式給出。
番石榴的InetAddresses將做的伎倆。
使用the IPAddress Java library這是簡單,每個方向一行代碼同時適用於IPv4和IPv6。實際上,您可以編寫適用於IPv4和IPv6的代碼,如下面的第一個示例所示。 免責聲明:我是該圖書館的項目經理。
IP版本無關的使用字節[]和/或的BigInteger:
IPAddress loopback = new IPAddressString("::1").getAddress();
System.out.println(loopback.getValue());
IPAddress backAgain = new IPAddressGenerator().from(loopback.getBytes());
System.out.println(backAgain);
對於IPv4使用INT:
IPv4Address loopbackv4 = new IPAddressString("127.0.0.1").getAddress().toIPv4();
System.out.println(loopbackv4.intValue());
IPv4Address backAgainv4 = new IPv4Address(loopbackv4.intValue());
System.out.println(backAgainv4);
使用的BigInteger對於IPv6:
IPv6Address loopbackv6 = new IPAddressString("::1").getAddress().toIPv6();
System.out.println(loopbackv6.getValue());
IPv6Address backAgainv6 = new IPv6Address(loopbackv6.getValue());
System.out.println(backAgainv6);
輸出:
1
0:0:0:0:0:0:0:1
2130706433
127.0.0.1
1
0:0:0:0:0:0:0:1
謝謝,似乎是一個富有成效的探索方式。似乎沒有辦法做到我想要的東西。 – Gruber 2012-02-03 13:53:15