2012-04-27 18 views
4

私は初心者です。私はC#4.0でIP範囲を取得するためのプログラムを書いていますが、それは小さな範囲ではうまくいきますが、クラスAのIPアドレスのような範囲に行くとプログラムに時間がかかります。私のコードです(良いアプローチではありません)。より良い方法で書くための任意の提案。C#でIP範囲を取得するには?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 

namespace ipSplitt 
{ 
    class MainClass 
    { 
     public static void Main(string[] args) 
     { 
      string[] z = new string[4]; 
      int t = 0; 
      string ip = "3.0.0.0"; 

      string[] Ip = ip.Split(new char[] { '.' }); 

      foreach (string m in Ip) 
      { 
       z[t] = m; 
       t++; 
      } 

      int a1, b1, c1, d1 = 0; 

      a1 = Convert.ToInt32(z[0]); 
      b1 = Convert.ToInt32(z[1]); 
      c1 = Convert.ToInt32(z[2]); 
      d1 = Convert.ToInt32(z[3]); 

      string[] v = new string[4]; 
      string ip2 = "3.255.255.255"; 
      int l = 0; 
      string[] Ip2 = ip2.Split(new char[] { '.' }); 

      foreach (string m in Ip2) 
      { 
       v[l] = m; 
       l++; 
      } 

      int a2, b2, c2, d2 = 0; 

      a2 = Convert.ToInt32(v[0]); 
      b2 = Convert.ToInt32(v[1]); 
      c2 = Convert.ToInt32(v[2]); 
      d2 = Convert.ToInt32(v[3]); 

      while (d2 >= d1 || c2 > c1 || b2 > b1 || a2 > a1) 
      { 
       if (d1 > 255) 
       { 
        d1 = 1; 
        c1++; 
       } 

       if (c1 > 255) 
       { 
        c1 = 1; 
        b1++; 
       } 

       if (b1 > 255) 
       { 
        b1 = 1; 
        a1++; 
       } 

       using (StreamWriter writer = new StreamWriter("import.txt",true)) 
        writer.WriteLine(a1 + "." + b1 + "." + c1 + "." + d1); 

       d1++; 
      } 
     } 
    } 
} 

答えて

1

は、.NETフレームワークにIPAddress classを見てみましょう、とstatic Parse機能。

+0

これは、OPがやっていることではありません。彼はそれらを解析していませんが、印刷しています。 – CodeCaster

+0

私は彼の質問を誤解しているかもしれません。 PS。あなたの答えは+1。私は自分の答えを書いた後に気づいただけです。しかし、私が編集したい時に、あなたはすでにそれに答えました。 – SynerCoder

0

毎回ファイルを開くので、すべてのIPに対してフラッシュされます。 using文をwhileブロックの周りに置く。

5

が、私は、クラスAのIPアドレスのような範囲のために行くときに、ファイル255^3回の処理を開閉しているので、私のプログラムは、多くの時間

をとります。外側whileループの周りにusing(Streamwriter ...)ブロックを置きます。

1

多くの時間が、この

using (StreamWriter writer = new StreamWriter("import.txt",true)) 
       writer.WriteLine(a1 + "." + b1 + "." + c1 + "." + d1); 

に行くだから、この

 StringBuilder sb = new StringBuilder(Int32.MaxValue); 
     sb.Append(a1.ToString() + "." + b1.ToString() + "." + c1.ToString() + "." + d1.ToString() + "\n"); 

を行うために必要があり、すべての後にちょうど

 File.WriteAllLines("import.txt", sb.ToString().Split('\n')); 
+0

私のシステムでメモリ例外が発生しました – accfews

+0

これを行う前にStringBuilder(Int32、Int32) – Likurg

+0

を修正しました – Likurg

1

StringBuilderのソリューションは、上でメモリ不足の例外スローを呼び出す私システムなので、簡単に追加する必要があります。

あなたの関数の上

StreamWriter writer = new StreamWriter("import.txt"); 
はその後

writer.WriteLine(a1 + "." + b1 + "." + c1 + "." + d1); 

using (StreamWriter writer = new StreamWriter("import.txt",true)) 
      writer.WriteLine(a1 + "." + b1 + "." + c1 + "." + d1); 

を交換して、下方に

writer.Close(); 

を追加します。 10秒で完了します。

+0

私の編集を試してください – Likurg

1

あなたのアプローチは簡単で、ここでは良い答えがあります。しかし... IPアドレスは何ですか?それは4バイトの整数ですよね?なぜINT32として範囲の制限を解析しないようにして、マスクを用いて出力ストリームに間の数字を印刷する10進数表現を取得するには:

127.0.0.1 = 01111111 00000000 00000000 00000001 
a = ip & 0xFF000000 
b = ip & 0x00FF0000 
c = ip & 0x0000FF00 
d = ip & 0x000000FF 

をしかし、まだループの外にストリームを初期化することを忘れないでください。

0

ファイルimport.txtに書き込むステートメントは、ループの速度を低下させる主な原因です。私はあなたがips.AppendLine(a1 + "." + b1 + "." + c1 + "." + d1);でStreamWriterコードを置き換えるべきだと思うここでは、ipsはStringBuilderオブジェクトです。ループ外 は、私は、コードを次のように書いた:

StreamWriter writer = new StreamWriter("import.txt", false)) 
char[] arr ; 

arr = new char[ips.Length] ; 
ips.CopyTo(0, arr, 0, ips.Length) ; 

writer.Write(arr); 
writer.Dispose() 

ここで私はStringBuilderのからIMPORT.TXTに文字列をダンプしません。でも私はchar []にコピーしてからダンプします。私はこれがずっと速いことを観察しました。私はこれが助けて欲しい!

関連する問題