2014-09-02 200 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