0

マスクに基づいて ipv6 アドレスをインクリメントしようとしています。インクリメントの代わりに F があると問題が発生します。誰でもこれをチェックできますか

public String IncrementIPV6ForPrefixLength (String IPv6String, int times) throws UnknownHostException
{

    int result , carry = 0, i;
    int bits;

    int mask=0;
    int index=IPv6String.indexOf("/");
    mask=Integer.parseInt(IPv6String.substring(index+1, IPv6String.length()));
    IPv6String=IPv6String.substring(0, index);

    InetAddress iaddr=InetAddress.getByName(IPv6String);
    byte[] IPv6Arr=iaddr.getAddress();
    if(mask > 128 || mask < 0)
        return null;

    i = mask/8;
    bits = mask%8;

    if(bits>0)
    {
        result = ((int)(IPv6Arr[i]>>(8-bits))) + times;
        IPv6Arr[i] =(byte) ((result << (8-bits)) | (IPv6Arr[i] & (0xff >> (bits))));
        carry = (result << (8-bits))/256;
        times /= 256;
    }
    i--;

    for(;i>=0;i--)
    {
        result = ((int)IPv6Arr[i]) + ((times + carry)& 0xFF);
        IPv6Arr[i] = (byte)(result % 256);
        carry = result / 256;
        if(carry == 0)
        {
            iaddr=InetAddress.getByAddress(IPv6Arr);
            String s=iaddr.toString();
            if(s.indexOf('/') != -1){
                s = s.substring(1, s.length()).toUpperCase();
            }
            StringBuffer buff =new StringBuffer("");
            String[] ss = s.split(":");
            for(int k=0;k<ss.length;k++){
                int Differ = 4 - ss[k].length();
                for(int j = 0; j<Differ;j++){
                    buff.append("0");
                }
                buff.append(ss[k]);
                if(k!=7)buff=buff.append(":");
            }
            return buff.toString()+"/"+mask;
        }
        times /= 256;
    }
    return null;
}

次のように入力します。

FD34:4FB7:FFFF:A13F:1325:2252:1525:325F/48
FD34:41B7:FFFF::/48
FD34:4FBF:F400:A13E:1325:2252:1525:3256/35

1インクリメントすると、このように出力されます

FD34:4FB8:0000:A13F:1325:2252:1525:325F/48
FD34:41B8:0000::/48
FD34:4FC0:0400:A13E:1325:2252:1525:3256/35

2インクリメントする場合

FD34:4FB8:0001:A13F:1325:2252:1525:325F/48
FD34:41B8:0001::/48
FD34:4FC0:1400:A13E:1325:2252:1525:3256/35

私が間違っているところを見つけてください。

4

1 に答える 1

0

投稿されたコードを無視して、IPv6アドレスが実際にある128ビットの数値に対する直接数値演算として演算をモデル化してみてください。に変換しBigIntegerて使用しますBigInteger.add

于 2012-09-06T09:29:31.187 に答える