[英]Manipulating IPv6 Addresses in Java
我知道之前也曾问过类似的问题,但我一直找不到合适的答案。 我基本上是在尝试编写一个函数,该函数将使用IPv6地址并为其添加或减去任意数量的IP地址。
我认为我遇到了字节排序问题,因为它适用于某些IPv6地址,但不适用于其他IPv6地址。 但是,由于卡住,我需要一些帮助来尝试解决问题。
我在下面提供了一个SSCCE来说明问题-它基本上是从InetAddress转换为BigInteger并再次返回-该想法是在中间从BigInteger执行加法或减法:
import java.math.*;
import java.net.*;
public class SSCCE {
public static void main(String[] args) {
String sIPv6 = "::00D3:0:2F3B:02AA:00FF:0";
try {
BigInteger n = new BigInteger(InetAddress.getByName(sIPv6).getAddress());
byte[] bytes = n.toByteArray();
System.out.println("Original = " + sIPv6);
System.out.println("New = " + InetAddress.getByAddress(bytes).getHostAddress());
}
catch (Exception e) {
e.printStackTrace();
}
}
}
运行此命令时,将得到以下输出:
Original = ::00D3:0:2F3B:02AA:00FF:0
java.net.UnknownHostException: addr is of illegal length
at java.net.InetAddress.getByAddress(Unknown Source)
at java.net.InetAddress.getByAddress(Unknown Source)
at SSCCE.main(SSCCE.java:12)
但是,如果我将IPv6地址更改为“ 2001 :: 00D3:0:2F3B:02AA:00FF:0”,则它可以正常工作。
问题在这里
BigInteger n = new BigInteger(InetAddress.getByName(sIPv6).getAddress());
byte[] bytes = n.toByteArray();
当调用toByteArray()
,返回的数组仅足够大以包含地址的所有有效位。 由于您的地址以0:0:...
开头,因此返回的字节数组将太短(14)。 您必须用二进制零左键填充以使其长128位(16字节)。
上面的答案是正确的,但不完整。 除了描述的左填充,您还必须偶尔删除具有17个字节的最高字节,这可能发生在最高字节中从8xxx到fxxx的地址,如以下答案所述: IPv6 ip(fc00::)地址是非法长度
换句话说,您必须将其扩展或缩小到16个字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.