2012-09-06 6 views
0

마스크를 기반으로 ipv6 주소를 증가 시키려고합니다. 증가 대신 F가있을 때 문제가 발생합니다. 어느 하나 PLZ 같이 본자바에서 마스크를 기반으로 ipv6 주소를 늘리는 방법은 무엇입니까?

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 

2

FD34:4FB8:0001:A13F:1325:2252:1525:325F/48 
FD34:41B8:0001::/48 
FD34:4FC0:1400:A13E:1325:2252:1525:3256/35 
,691,363 씩 증가하는 경우 1

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

씩 증가하는 경우이 같은 출력210

내가 잘못하고있는 곳을 찾을 수 있습니다.

+0

전혀 작동하지 않는 것 같습니다. –

답변

0

게시 된 코드를 무시하고 IPv6 주소가 실제로있는 128 비트 숫자에서 직접 수치 연산으로 모델링 해 봅니다. BigInteger으로 변환하고 BigInteger.add을 사용하십시오.

+0

내가 좋아한다면 어떻게 biginteger를 ipv6 주소로 변환 할 수 있습니까? 설명해 주시겠습니까? –

+0

ipv6 주소는 가독성을 위해':'문자가 삽입 된 128 비트 정수의 16 진수 표현입니다. – Deestan

+0

"정수를 16 진수 문자열로"시작하는 검색 문구입니다. – Deestan

관련 문제