繁体   English   中英

用Java处理IPv6地址

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM