将IPv6转换为长到IPv6的长和长

我应该如何执行从IPv6到long的转换,反之亦然?

到目前为止我有:

public static long IPToLong(String addr) { String[] addrArray = addr.split("\\."); long num = 0; for (int i = 0; i > 24) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + (ip & 0xFF); } 

这是正确的解决方案还是我错过了什么?

(如果解决方案适用于ipv4和ipv6,那将是完美的)

IPv6地址是128位数字,如此处所述。 Java中的长整数以64位表示,因此您需要另一个结构,如BigDecimal或两个long(具有两个long的数组的容器或仅仅是两个long的数组),以便存储IPv6地址。

下面是一个例子(只是为了给你一个想法):

 public class Asd { public static long[] IPToLong(String addr) { String[] addrArray = addr.split(":");//a IPv6 adress is of form 2607:f0d0:1002:0051:0000:0000:0000:0004 long[] num = new long[addrArray.length]; for (int i=0; i> 16; } } return ipString; } static public void main(String[] args) { String ipString = "2607:f0d0:1002:0051:0000:0000:0000:0004"; long[] asd = IPToLong(ipString); System.out.println(longToIP(asd)); } 

}

您也可以使用java.net.InetAddress
它适用于ipv4和ipv6(所有格式)

 public static BigInteger ipToBigInteger(String addr) { InetAddress a = InetAddress.getByName(addr) byte[] bytes = a.getAddress() return new BigInteger(1, bytes) } 

IPv6地址不能长存储。 您可以使用BigInteger而不是long。

 public static BigInteger ipv6ToNumber(String addr) { int startIndex=addr.indexOf("::"); if(startIndex!=-1){ String firstStr=addr.substring(0,startIndex); String secondStr=addr.substring(startIndex+2, addr.length()); BigInteger first=ipv6ToNumber(firstStr); int x=countChar(addr, ':'); first=first.shiftLeft(16*(7-x)).add(ipv6ToNumber(secondStr)); return first; } String[] strArr = addr.split(":"); BigInteger retValue = BigInteger.valueOf(0); for (int i=0;i