Die Suche nach einem String innerhalb eines Strings wird in .NET sehr gut unterstützt, aber was tun Sie, wenn die zu suchenden Daten keine Zeichenfolge sind?Suche nach Byte []
Ich habe binäre Daten, die über einen NetworkStream in regelmäßigen Chunks ankommen. Pakete sind binär, aber sie beginnen alle mit einer Signaturfolge von Bytes. Ich akkumuliere die Chunks in einen größeren Puffer und suche nach der Signatur des Startpakets.
Was ich wirklich suche ist die byte[]
entspricht der String.IndexOf(ss)
Methode. Ich habe das unangenehme Gefühl, dass ich das selbst mit einer Schleife und einer Zustandsmaschine implementieren muss.
Irgendwelche Vorschläge? Zu dir hinüber!
Wie vorgeschlagen, Array.IndexOf (Byte) wird mir zumindest eine explizite Schleife speichern. Seit der Veröffentlichung kam ich auf die Idee, das erste Signaturbyte zu finden und dann nach einer Übereinstimmung zu suchen, bei der das letzte Signaturbyte sein sollte. Wenn beide übereinstimmen, versuchen Sie einen Brute-Force-Vergleich für den Rest der Zeichenkette. Dieser Ansatz hat den Vorteil, falsche Übereinstimmungen billig abzulehnen und es mir zu erlauben, billig zurückzuweisen, wenn eine Teilsignatur einen anderen Teil ansteht.
Google enthüllt, dass der obige brillante Plan ein entarteter Fall von "KMP" oder Knuth-Morris-Pratt-Algorithmus ist. Auf der hellen Seite, wenn Knuth seinen Namen darauf geschrieben hat, ist es wahrscheinlich gefettete Blitze, auf der Unterseite warum hat Donald Knuth, wenn ich eine gute Idee habe, vor 25 Jahren daran gedacht?
Da ich die Punkte nicht an Donald Knuth vergeben kann, schätze ich, dass sie nach Nelson gehen.
Ich kann das Protokoll nicht schreiben, ich spreche mit Legacy-Hardware. Ich schreibe die nächste Version und habe Ihren Vorschlag bereits präzisiert. –