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;
}