2012-03-10 10 views
0

私は、テキスト内のパターンを発見するには、以下の機能を書いた:それが表示されますパターンをバイナリファイルで検索しますか?

bool match(char* patt,char* text){ 

    int textLoc=0, pattLoc=0, textStart=0; 

    while(textLoc < (int) strlen(text) && pattLoc < (int)strlen(patt)){ 

     if(*(patt+pattLoc) == *(text+textLoc)){  
      textLoc= textLoc+1;   
      pattLoc= pattLoc+1;  
     } 
     else{   
      textStart=textStart+1; 
     textLoc=textStart;   
     pattLoc=0; 
     }  
    } 


    if(pattLoc >= (int) strlen(patt)) 
     return true; 
    else return false; 

} 

、機能はタイプchar*の2つのパラメータを取ります。私はbinary fileのパターンを見つけるためにこの機能を使いたいのですが、この問題を解決するために何を提案していますか?

+0

バイナリファイルでは、ファイルを自分でメモリにマップしているのですか、それを読み込んでDLLを挿入していますか? –

+0

@ Mike Kwanはい私は 'CreateFilemMapping'などでメモリにファイルをマップします。 – Aan

+0

バイナリファイルにnullバイトが含まれていないとどうなるか考えてみましょう。データのバイナリストリームをヌル終了文字列として扱うことはできません。 –

答えて

1

ここには間違いがありません。私がここで考慮する唯一の違いは、文字列の代わりにバッファ/サイズのアプローチを使用することです。

ファイルをどのように読むかを検討する必要があります。ファイル全体をメモリに読み込むのか、それともセクションで読み上げるのですか?

セクションで読む場合は、必ず各セクションの最後の部分(検索パターンのサイズ)を保存し、次のセクションの先頭に追加します。このようにして、各セクションのカットオフも評価されます。

1

あなた自身が普及しているstrstr機能を実装しようとしたようです。しかし、それはバイナリのパターンを見つけることを頼んだので、あなたを助けません。この場合に使用する関数は、memmemと呼ばれます。

+0

それはLinux用ですか?私はWindowsを使用しています。 – Aan

+0

そうです、 'memmem'関数はどこにもありません。しかし、 'gitmemmem'と呼ばれるgitプロジェクトには、優れた単純な実装があります。あなたはそれを自分で行う代わりに使うことができます。 –

1

ファイル内のパターンを見つける最も良い方法を探しているように聞こえるようになります。パターンP = A1A2 ...、FNDテキストT = B1B2 ... BM中のPのすべての出現を考えると

:その場合は、単一および複数のパターン照合のための非常に良いドキュメントがあります。

例をmultipatternへの拡張:パターンのセット、P1、P2、...、 P1の与えられ、

FNDテキストT = B1B2 ... BM中のPのすべてのオカレンス。

簡単な説明のためにこれを確認することができ、より詳細で異なる実装/コードについてはthis oneをチェックすることができます。

+0

入れたリンクがうまくいかない! – Aan

+0

@Adban申し訳ありません。今すぐ更新されたリンク。 –

関連する問題