2014-09-02 143 views
0

我輸入的文本數據,如下列:解析和IP的增量地址

AX AMDBCEFG 103.12.96.0  103.12.98.255 
AX AMDBDEFG 103.11.64.0  103.13.64.255 
AX AMDBEEFG 103.14.24.0  103.14.24.255 

我找的輸出是一個新的文本文件:

AX AMDBCEFG 103.12.96.0  103.12.96.255 
AX AMDBCEFG 103.12.97.0  103.12.97.255 
AX AMDBCEFG 103.12.98.0  103.12.98.255 
AX AMDBDEFG 103.11.64.0  103.11.64.255 
AX AMDBDEFG 103.12.64.0  103.12.64.255 
AX AMDBDEFG 103.13.64.0  103.13.64.255 
AX AMDBEEFG 103.14.24.0  103.14.24.255 

First line從輸入遞增3rd Octet只即96 to 98
Second line從輸入增加2nd Octet,即只有11 to 13
Third line來自輸入remains same

我至今嘗試:

我對待IP定義爲字符串,然後的.在此基礎上是做的相當繁瑣的事情上分裂。

string sFile = "D:\\input.txt"; 
string sNewFilePath = Path.Combine(@"D:\\Output", Path.GetFileName(sFile)); 
string[] arrLines = File.ReadAllLines(sFile); 

using (StreamWriter writer = new StreamWriter(sNewFilePath)) 
{ 
    foreach (string sLine in arrLines) 
    { 
     string[] arrTab = sLine.Split('\t'); 
     string sIP1 = arrTab[2].Trim(); 
     string sIP2 = arrTab[3].Trim(); 

     string[] arrIP1 = sIP1.Split('.'); 
     string[] arrIP2 = sIP2.Split('.'); 

     int iOct1_IP1 = Convert.ToInt32(arrIP1[1]); 
     int iOct1_IP2 = Convert.ToInt32(arrIP2[1]); 

     int iOct2_IP1 = Convert.ToInt32(arrIP1[2]); 
     int iOct2_IP2 = Convert.ToInt32(arrIP2[2]); 

     int iOct1_Diff = iOct1_IP2 - iOct1_IP1; 
     int iOct2_Diff = iOct2_IP2 - iOct2_IP1; 

     if (iOct1_Diff > 0) 
     { 
      //loop & increment 
      //write lines to file 
     } 
     else if (iOct2_Diff > 0) 
     { 
      //loop & increment 
      //write lines to file 
     } 
    } 
} 

在繼續我進一步之前,我發現我可以使用System.Net.IPAddress

System.Net.IPAddress ip1 = System.Net.IPAddress.Parse(sIP1.Trim()); 
System.Net.IPAddress ip2 = System.Net.IPAddress.Parse(sIP2.Trim()); 

if (ip1.Equal(ip2)) 
{ 
    //... 
} 

我的問題,是否有任何使用上述類或任何其他技術來達到此目的的首選方式?

對於對用於增量IP地址的術語缺乏瞭解,感到抱歉。

謝謝。

+0

什麼你想要實現嗎?我不明白你的問題或你想解決什麼問題。 – Jehof 2014-09-02 09:32:21

+0

想要一個顯示IP地址的開始和結束範圍的輸出文件(如示例所示)。 – Hassan 2014-09-02 09:36:49

回答

1

最好的方法是一直使用BCL的現有解析/格式方法,如IPAddress類的Parse方法。

您可以使用方法IPAddress.GetAddressBytes爲獲得地址的單件後

然後,您可以增加地址的單件,並創建新的地址

見的工作實例演示:https://dotnetfiddle.net/cjwlXk

這也適用於範圍不同的第二和第三部分,如192.168.1.0 - > 192.169.14.0

foreach (var item in items) 
{ 
    var fromIp = item.From.GetAddressBytes(); 
    var toIp = item.To.GetAddressBytes(); 

    Console.WriteLine("From {0} to {1}", item.From.ToString(), item.To.ToString()); 

    foreach (byte secondPart in Enumerable.Range(fromIp[1], toIp[1] - fromIp[1] + 1)) 
    { 
     foreach (byte thirdPart in Enumerable.Range(fromIp[2], toIp[2] - fromIp[2] + 1)) 
     { 
      var ip = new IPAddress(new byte[] {fromIp[0], secondPart, thirdPart, fromIp[3]}); 
      yield return string.Format("{0}\t{1}\t{2}\t{2}", item.C1, item.C2, ip.ToString()); 
     } 
    } 
} 
+0

謝謝@Enrico的回答。我認爲這是解析IP的正確方法。你可以修改你的代碼在每個第二個IP的末尾加上'255'嗎?我還沒有嘗試過,只看過演示。 – Hassan 2014-09-02 15:07:42

+1

改變了演示,只需使用''var ip = new IPAddress(new byte [] {fromIp [0],secondPart,thirdPart,toIp [3]});''用構造函數的最後一個參數使用toIp地址部分 – 2014-09-02 15:10:34

+0

Ok 。是的,我只是想出了它。每個第一個IP的最後八位字節也顯示爲255.無論如何,感謝您的出色答案。 – Hassan 2014-09-02 15:12:18