2017-01-04 4 views
1

ファイルの内容を読み込み、データ内の16進数を検索したいと考えています。私は "file.readallbytes"を使うのは残念だと思います。なぜなら、16進数の一致が見つかるまで、バイトごとに読み出す必要があるからです。代わりに私が代わりに使うことができる、またはパフォーマンスのためにreadallbytesを使う方が良い方法がありますか?私が現在行っていることは、現在のように動作します。ファイルをバイト単位で読み込み、一致する16進数の文字列を見つける方法はありますか?

私が読もうとしているファイルは単純なテキストファイルで、そのファイルには "hello"があります。 mfatihする

string match = "68656C6C6F"; 

foreach (var jsfile in jsscan) 
{ 
    byte[] data = File.ReadAllBytes(jsfile); 
    string dataString = String.Concat(data.Select(b => b.ToString("X2"))); 
    if (dataString.Contains (match)) 
    { 
     MessageBox.Show(jsfile + dataString); 
    } 
} 

更新ソリューションのおかげ:

public void example() 
{ 

    string match = "68656C6C6F"; //This is "hello" in hex 
    byte[] matchBytes = StringToByteArray(match); 


    foreach (var jsFile in jsscan) 
    { 
     using (var fs = new FileStream(jsFile, FileMode.Open)) 
     { 
      int i = 0; 
      int readByte; 
      while ((readByte = fs.ReadByte()) != -1) 
      { 
       if (matchBytes[i] == readByte) 
       { 
        i++; 
       } 
       else 
       { 
        i = 0; 
       } 
       if (i == matchBytes.Length) 
       { 
        Console.WriteLine("It found between {0} and {1}.", 
         fs.Position - matchBytes.Length, fs.Position); 
        break; 
       } 
      } 
     } 
    } 
} 
public static byte[] StringToByteArray(String hex) 
{ 
    int NumberChars = hex.Length; 
    byte[] bytes = new byte[NumberChars/2]; 
    for (int i = 0; i < NumberChars; i += 2) 
      bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
    return bytes; 
} 
+1

入力16進数を文字列に変換して比較することを検討しましたか? –

+0

ねえ、運がよかった!はい、私はそれが今私が正しくやっていると信じていますか? readallbytesを各ファイルの16進形式に変換し、 "Contains"を使用して16進数を文字列として一致させます。ファイル全体を読まなくても効率的な方法があるのだろうか?私は特定のオフセットから開始したくはありません。一般的にファイル全体だけです。 – DropItLikeItsHot

+0

[指定されたバイトシーケンスが開始するストリーム内の位置を見つけるのに最適な方法](http://stackoverflow.com/questions/1471975/best-way-to-find-position-in-the-stream-where- given-byte-sequence-starts) –

答えて

1

全体のファイルに読み込むことなく、より効率的な方法があります。私はこの方法があなたを助けることを願っています。

string match = "68656C6C6F"; 

byte[] matchBytes = Encoding.ASCII.GetBytes(match); 

foreach (var jsFile in jsscan) 
{ 
    using (var fs = new FileStream(jsFile, FileMode.Open)) 
    { 
     int i = 0; 
     int readByte; 
     while ((readByte = fs.ReadByte()) != -1) 
     { 
      if (matchBytes[i] == readByte) 
      { 
       i++; 
      } 
      else 
      { 
       i = 0; 
      } 
      if (i == matchBytes.Length) 
      { 
       Console.WriteLine("It found between {0} and {1}.", 
         fs.Position - matchBytes.Length, fs.Position); 
       break; 
      } 
     } 
    } 
} 
+0

これはしっかりしていますが、ファイルをファイルストリームに読み込むときには動作しません。 「動作させることができません」とは、見つかったバイトのコンソール出力を表示しないことを意味します。私はそれも正しいファイルを見ていることを確認しました。 – DropItLikeItsHot

+0

これはデバッグしました。if(matchBytes [i] == readByte)で失敗しているようです。私は "byte [] matchBytes = Encoding.ASCII.GetBytes(match);"と信じています。誤って実装されています。これは、matchBytesがnullであることを示しています。何か案は? – DropItLikeItsHot

+0

GetBytes関数が「byte [] matchBytes = {104,101,108,108,111};」に置き換えられて正しく機能していないことが確認されました。期待どおりに機能しました。私が原因を見つけたら、さらに研究をして私の投稿を更新します。 – DropItLikeItsHot

関連する問題