【问题标题】:Parsing and Increment of IP AddressesIP地址的解析和递增
【发布时间】:2014-10-26 12:13:27
【问题描述】:

我输入了如下文本数据:

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 Octet96 to 98
Second line 从输入递增 2nd Octet11 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 地址的术语缺乏了解。

谢谢。

【问题讨论】:

  • 你想归档什么?我不明白您的问题或您要解决的问题。
  • 想要一个显示 IP 地址的开始和结束范围的输出文件(如示例所示)。

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


【解决方案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());
        }
    }
}

【讨论】:

  • 感谢@Enrico 的回答。我认为这是解析 IP 的正确方法。您可以修改您的代码以在每个第二个 IP 的末尾获得 255 吗?还没试过,只看了demo。
  • 更改了demo,只需使用var ip = new IPAddress(new byte[] {fromIp[0], secondPart, thirdPart, toIp[3]});和构造函数的最后一个参数,使用toIp地址部分
  • 好的。是的,我刚刚想通了。每个第一个 IP 的最后一个八位字节也显示 255。无论如何,感谢您的出色回答。
  • 现在在演示中,第一个地址以 .0 结尾,第二个地址以 .255 结尾(来自原始值)
猜你喜欢
  • 2011-03-29
  • 2015-09-14
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2014-10-11
  • 2023-04-07
  • 1970-01-01
相关资源
最近更新 更多