解析和递增 IP 地址

本文关键字:IP 地址 | 更新日期: 2023-09-27 18:20:22

我有如下输入文本数据:

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 Octet11 to 13 .
从输入remains same Third line

到目前为止我尝试过:

我将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 地址的术语的知识。

谢谢。

解析和递增 IP 地址

最好的方法是始终使用BCL的现有解析/格式化方法,如IPAddress类的解析方法。

您可以在使用方法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());
        }
    }
}