2011-09-25 19 views
5

可能な重複のバイトが含まれているかどうかを判断:
byte[] array pattern searchバイトの配列が特定の順序

のは、私はバイトの配列を持っているとしましょう:

byte[] myArray = new byte[]{1,2,3,4,5,6,7,1,9,3,4,3,4,7,6,5,6,7,8}; 

どのようにすることができます私はmyArrayがその順序でバイト9,3,4,3を含んでいるかどうか決定する?各要素を文字列に追加する配列を反復処理してからString.Contains()メソッドを使用して、そのバイト配列にその要素がその順序で含まれているかどうかを確認する必要がありますか?

私は同じようsemething行うことができます知っている:

String s = ""; 
foreach(byte b in myArray) 
{ 
    s = s + b.ToString(); 
} 

//then do 

s.Contains("9343") 

これは長いアレイで効率的にではありません。これを行うより効率的な方法は何でしょうか?

+0

が含まれています:文字列のmyString = System.Text.Encoding.ASCII.GetString(myByteArray) が、適切な答え;-)私は変換する必要はありません – gordatron

+0

待ちますそれを文字列に変換します。私は文字列を使用しました。これは、それが私がそのタイプの比較を行うことを可能にする唯一の方法だからです。便利でしたが、ありがとうございました –

+0

本当に似たような質問がありました。申し訳ありませんが見つかりませんでした。 –

答えて

8

public static bool ContainsSequence(byte[] toSearch, byte[] toFind) { 
    for (var i = 0; i + toFind.Length < toSearch.Length; i++) { 
    var allSame = true; 
    for (var j = 0; j < toFind.Length; j++) { 
     if (toSearch[i + j] != toFind[j]) { 
     allSame = false; 
     break; 
     } 
    } 

    if (allSame) { 
     return true; 
    } 
    } 

    return false; 
} 
+0

私のクイックテストでは、これは1つのエラーでオフになっていました。検索するデータが配列内の最後の要素だった場合は、ループを早期に終了します。 これを確認して回答を投稿するためにもう少しテストをしますが、今は基本的に最初のループ条件を '<=' – CubanX

1

あなたはあなたがしてて一緒に歩いて探しているバイトパターンの最初のバイトに一致するものを見つけるまで、バイト配列を通じてリッピングする作品とされ、最も単純なアルゴリズムを試してみてくださいあなたが最後に達するまで、または不一致が見つかった場合は、中止したところから続行してください。部分的に一致し続けると、これは「劣化」する可能性があります。あなたのニーズに応じて、これは十分に良いかもしれません(書くのは簡単で、維持しやすいです)。

これで十分ではない場合は、Boyer-Mooreを簡単に採用できます。あなたが何をした文字列を作ることを考えている場合

関連する問題