解析和增加IP地址

时间:2014-09-02 09:13:55

标签: c# string parsing text-files ip-address

我输入了如下文字数据:

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的{​​{1}}。

到目前为止我尝试了什么

我已将IP视为字符串,然后在remains same的基础上进行拆分,这是非常繁琐的事情。

.

在继续讨论之前,我发现我可以使用System.Net.IPAddress

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
        }
    }
} 

我的问题是,是否有任何首选方式使用上述类或任何其他技术来实现这一目标?

很抱歉因为对增量IP地址使用的术语缺乏了解。

谢谢。

1 个答案:

答案 0 :(得分: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());
        }
    }
}