Um eine Position in einem C# – Stream (z.B.: ein System.IO.Stream) zu finden, kann man dies mit einer byte-Sequenz erreichen.
Dazu wird der Stream und die zu findende byte-Sequenz an eine Methode übergeben, die zuerst die Länge der byte-Sequenz in ein byte-Array buffert.
Danach instanziiert man einen neuen BufferedStream mit dem zu übergebenen Stream und der byte-Sequenzlänge.
In einer While-Schleife wird nun überprüft ob der BufferStream gleich der byte-Sequenz ist. Ist dem so, wird die BufferStream-Position minus der byte-Sequenzlänge als Matched-Position zurückgegeben.
Ist der BufferStream und die byte-Sequenzlänger nicht gleich, wird die PadLeftSequence mit den Parametern buffer und byteSequence aufgerufen.
public static long FindPosition(Stream stream, byte[] byteSequence) { if (byteSequence.Length < stream.Length) return -1; byte[] buffer = new byte[byteSequence.Length]; using (BufferedStream bufStream = new BufferedStream(stream, byteSequence.Length)) { int i; while ((i = bufStream.Read(buffer, 0, byteSequence.Length)) == byteSequence.Length) { if (byteSequence.SequenceEqual(buffer)) return bufStream.Position - byteSequence.Length; else bufStream.Position -= byteSequence.Length - PadLeftSequence(buffer, byteSequence); } } return -1; }
In dieser Methode (PadLeftSequence()) wird wie gesagt, der Buffer (bytes) und die byte-Sequenz (seqBytes) als Parameter übergeben. In einer While-Schleife werden die beiden byte-Arrays aux1 & aux2 kopiert und die Variable n dekrementiert. Ist nun aux1 gleich mit aux2, haben wir die Position gefunden und geben sie zurück.
private static int PadLeftSequence(byte[] bytes, byte[] seqBytes) { int i = 1; while (i < bytes.Length) { int n = bytes.Length - i; byte[] aux1 = new byte[n]; byte[] aux2 = new byte[n]; Array.Copy(bytes, i, aux1, 0, n); Array.Copy(seqBytes, aux2, n); if (aux1.SequenceEqual(aux2)) return i; i++; } return i; }