繁体   English   中英

IPv6 ip(fc00::) addr的长度非法

[英]IPv6 ip (fc00::) addr is of illegal length

将BigInteger转换为InetAddress时看到错误。 仅当使用特定IP“ fc00 ::”时才会发生这种情况。 这是我的测试代码。 如果我缺少什么,请告诉我。

    public class IPv6Test {

          public static BigInteger ipv6ToNumber(InetAddress Inet6Address)
         {
         return new BigInteger(1,Inet6Address.getAddress());
         }

        public static void main(String[] args) throws UnknownHostException
        {

        InetAddress iaStart = InetAddress.getByName("fc00::");

                BigInteger biStart = ipv6ToNumber(iaStart);

        System.out.println(biStart.toString());


        System.out.println(InetAddress.getByAddress(biStart.toByteArray()).getHostAddress()) ;


 }

}

原因是BigInteger在biStart.toByteArray();中增加了一个字节。

它给了您17个字节,这太长了,IPv6地址是16个字节。 多余的字节在高端,为0。

如果您在代码中执行此操作,那么它将起作用:

 byte bytes[] = biStart.toByteArray();
 if(bytes.length > 16) {
        byte bytes2[] = new byte[16];
        System.arraycopy(bytes,  1,  bytes2,  0,  bytes2.length);
        bytes = bytes2; 
 }

如果阅读BigInteger.bitLength()的javadoc,则表明大整数的二进制补码表示形式至少为bitLength()+ 1位长。 toByteArray()为您提供二进制补码。 由于您需要所有128位来表示此地址,并且您在谈论一个额外的位,因此最终得到17个字节。

为什么会有多余的字节? 那是因为您的地址是一个正数。 但是最高字节是fc00,它的二进制补码变为负数。 因此,高端必须有一个额外的0位,以使数字在2的补码中保持正数,因此2的补码表示需要129位或17个字节,而不是128位和16个字节。 对于最高位为1的任何地址,或以8xxx到fxxx开头的任何地址,例如fc00,都会发生这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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