2012-09-20 27 views
3

我有一個如下所示的ip數組,我想將其轉換爲最小的cidr子網列表。 Java中有這樣的庫嗎?將ip數組轉換爲java中最小的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庫。事實上,我對Java知之甚少:)但是我可以給你一個解決問題的算法,如果這有什麼幫助的話。

1)轉換的IP地址到雙整數,其中第一個整數是IP地址的二進制表示(ABCD的 - >一個< < 24 + B < < 16 + C < < 8 + d)和第二個整數是32(即,最初每個地址是它自己的子網[1])。

2)對排序列表進行排序。

3)現在掃描排序的列表,從第二對開始。對於每一對,如果你可以將它與前一個結合起來,那麼這樣做並繼續嘗試,直到儘可能長時間結合爲止。如果bits1 == bits2base2^base1 == 1 << (32 - bits1)可以組合兩對[base1, bits1][base2, bits2]。在這種情況下,組合是[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

你開玩笑嗎? 如果ip是12.12.12.1就像ip一樣會發生什麼情況。 substr會失敗。我需要一個算法解決方案或一個庫。您的解決方案基於我的輸入,但輸入不同會失敗。 – denizeren

+1

如果是這樣,爲什麼沒有完全在你的文章中提交?我只是解決了這個問題。 – CycDemo

+1

這甚至不是一個真正的答案。寫任何只產生給定輸出的東西都浪費每個人的時間。這顯然不能解決非常明顯的問題。 – sillyMunky