文字列内の文字列の検索は .NET で非常によくサポートされていますが、検索する必要があるデータが文字列ではない場合はどうすればよいでしょうか?
NetworkStream を介して通常のチャンクで到着するバイナリ データがあります。パケットはバイナリですが、すべてバイトのシグネチャ シーケンスで始まります。チャンクをより大きなバッファーに蓄積し、パケット開始の署名を探します。
私が本当に探しているのは、メソッドbyte[]と同等です。String.IndexOf(ss)ループとステートマシンを使ってこれを自分で実装しなければならなくなる気がします。
助言がありますか?あなたに!
示唆されているように、 Array.IndexOf(byte) は少なくとも明示的なループを節約します。投稿以来、最初の署名バイトを見つけて、最後の署名バイトがあるべき場所を先に調べて、両方が一致する場合は、文字列の残りの部分を力ずくで比較してみることにしました。このアプローチには、誤った一致を安価に拒否し、別のチャンクを保留している部分的な署名がある場合に安価に拒否できるという利点があります。
Googleは、上記の素晴らしい計画が「KMP」またはKnuth-Morris-Prattアルゴリズムの退化したケースであることを明らかにしています. 明るい面では、クヌースが彼の名前を付けた場合、それはおそらく油を塗った稲妻です.
ドナルド・クヌースにポイントを与えることはできないので、ネルソンに行くと思います。