我应该如何执行从IPv6到long的转换,反之亦然?
到目前为止我有:
public static long IPToLong(String addr) {
String[] addrArray = addr.split("\\.");
long num = 0;
for (int i = 0; i < addrArray.length; i++) {
int power = 3 - i;
num += ((Integer.parseInt(addrArray[i], 16) % 256 * Math.pow(256, power)));
}
return num;
}
public static String longToIP(long ip) {
return ((ip >> 24) & 0xFF) + "."
+ ((ip >> 16) & 0xFF) + "."
+ ((ip >> 8) & 0xFF) + "."
+ (ip & 0xFF);
}
这是正确的解决方案还是我遗漏了什么?
(It如果该解决方案同时适用于IPv4和IPv6,则将是完美的)
4条答案
按热度按时间eulz3vhy1#
你也可以使用
java.net.InetAddress
,它支持ipv4和ipv6(所有格式)。根据OTrains的评论,原始答案已更新为使用无符号整数。
rsl1atfo2#
IPv6地址是一个128位的数字,如here所述,Java中的long表示为64位,因此需要另一种结构,如BigDecimal或two long(包含两个long的数组的容器,或简单地包含两个long的数组)来存储IPv6地址。
下面是一个示例(仅供参考):
im9ewurl3#
IPv6地址不能以long格式存储。可以使用BigInteger代替long格式。
mpbci0fu4#
维诺德的答案是正确的,但仍有一些地方需要改进。
首先,在方法“countchar”中,“continue”应替换为“break”。
第二,必须考虑一些边界条件。