2012-09-20 2 views
3

저는 아래와 같이 ip 배열을 가지고 있으며 이것을 가장 작은 cidr 서브넷 목록으로 변환하려고합니다. Java 용 라이브러리가 있습니까? 예를 들어자바에서 ip 배열을 가장 작은 cidr 서브넷 목록으로 변환하십시오.

:

1.1.3.0 
1.1.3.1 
1.1.3.2 
1.1.3.3 
.. 
1.1.3.254 
1.1.3.255 
1.2.3.0 
1.2.3.1 
1.2.3.2 
1.2.3.3 
.. 
1.2.3.254 
1.2.3.255 
1.3.3.0 
1.3.3.1 
1.3.3.2 
1.3.3.3 
.. 
1.3.3.128 
1.3.3.129 

변환 사전에

1.1.3.0/24 
1.2.3.0/24 
1.3.3.0/25 
1.3.3.128/31 

감사

합니다.

답변

2

나는 자바에서 사용할 수있는 라이브러리가 있는지 모른다. 사실, 나는 Java에 대해 거의 안다. :) 그러나 도움이된다면 문제 해결을위한 알고리즘을 제공 할 수있다.

1) 첫 번째 정수는 이진 IP 주소의 표현 (ABCD 인 정수 쌍으로 IP 주소를 변환 ->를 < < 24 + B < < 16 + C < < 8 + d) 상기 두 번째 정수는 32입니다 (즉, 처음에는 각 주소가 자신의 서브넷 [1] 임).

2) 쌍 목록을 정렬하십시오.

3) 이제 두 번째 쌍부터 정렬 된 목록을 스캔하십시오. 각 쌍마다 이전의 조합과 조합 할 수 있다면 가능한 한 결합 할 때까지 계속 시도하십시오. 두 쌍 [base1, bits1][base2, bits2]bits1 == bits2base2^base1 == 1 << (32 - bits1) 인 경우 결합 할 수 있습니다. 이 경우 조합은 [base1, bits1 - 1]입니다.

4) 마지막으로 쌍을 CIDR 표기법으로 다시 변환하십시오. 첫 번째 정수는 서브넷의베이스 (점으로 된 십진수로 다시 변환 될 때)이고 두 번째 정수는 비트 폭입니다.

모두 2와 3 O(n log n)

각주 1입니다 단계 : 당신의 예에서, 당신이 내 알고리즘 테스트 케이스에 실패 할 것을 의미합니다 마지막 바이트 0과 주소를 포함하지 않는다. 목록에 추가해야합니다. 이 점은 CIDR 서브넷의 정의에서 미묘하지만 중요한 세부 사항을 나타냅니다. 기술적으로 가장 작은 가능한 서브넷은/30입니다. 범위의 첫 번째 및 마지막 IP가 모두 예약되어 있기 때문입니다. 따라서/31에는 유효한 IP 주소가 없습니다. 그러나 사람들은 종종 CIDR 서브넷이라는 용어를 필터 표현식과 같이 "IP 주소 집합을 인식하는 비트 마스크"라는 의미로 사용합니다.

+0

@compdev에서 언급 한 오류를 수정하기위한 고정 된 계산 – rici

-4

는 시도 :

public class Test { 
    public static void main(String[] args) { 
     String[] ipArray1 = new String[]{"1.1.3.1", "1.1.3.3", "1.1.3.2", "1.3.3.254"}; 
     String[] ipArray2 = new String[ipArray1.length]; 
     for(int i=0; i < ipArray1.length; i++) { 
      String temp = ipArray1[i]; 
      ipArray2[i] = temp.substring(0,6) + "0/24"; 
     } 
     for(String ip : ipArray2) { 
      System.out.println(ip); 
     } 
    } 
} 

출력 :

1.1.3.0/24 
    1.1.3.0/24 
    1.1.3.0/24 
    1.3.3.0/24 
+0

당신은 kiddin '입니까? ip가 12.12.12.1 인 경우 어떻게됩니까? substr이 실패합니다. 알고리즘 솔루션이나 라이브러리가 필요합니다. 솔루션은 내 입력을 기반으로하지만 입력이 다를 경우 실패합니다. – denizeren

+1

그렇다면 게시자가 게시물에 완전히 제출하지 않은 이유는 무엇입니까? 난 그냥 문제로 게시물을 해결. – CycDemo

+1

정말 답이 아닙니다. 주어진 산출량을 산출하는 것을 작성하는 것은 모든 사람의 시간 낭비입니다. 분명히 제기 된 질문은 분명히 해결되지 않습니다. – sillyMunky

관련 문제