af0815 hat geschrieben:Meiner Meinung nach, darfst dudie Blõcke nicht um einfach 1024 verschieben. Wenn das Pattern über die Buffergrenze geht. Ich würde 1024 um die Länge des Pattern mvermindern Poitioniert nachladen, die Lä nge kann ja mit 1024 gleich bleiben.
Bei meinem ansatz ist die Patterngrenze egal, da der State zwischen zwei memory scans sich nicht verändert. Wenn der z.B. nach Welt! sucht bei 4 bytes block größe in "Hallo Welt!!" sucht würde das so ablaufen:
1. Buffer "Hall" -> Result(checkmem) = 4 State = 0 (es ist am ende kein teil von Welt drin)
2. Buffer "o We" -> Result = 4, State = 2 (zwei 2 des patterns gefunden bevor ende)
3. Buffer "lt!!" -> Result = 3 (nach nur 3 zeichen frühzeitig terminiert weil gefunden) State = 5 (alle 5 teile des patterns gelesen)
das ergebnis wäre also Result1 + Result2 + Result3 - "Welt!".length = 4+4+3-5 = 6. Das Pattern steht also an Position 6 des streams.
Übrigens, man kann das ganze auch als generische Klasse für beliebige Typen bei denen der Gleichheitsoperator überladen ist bauen, man kann also nicht nur nach texten suchen, man kann auch in einem Array von Objekten oder Klassen suchen. Wenn man komplexer suchen will kann man diesen Automaten (letzendlich ists nichts anderes als ein Deterministischer Endlicher Automat) auch auf Regex erweitern.