Codefieber.de

IT-Blog

C# – Position per byte-Sequenz in Stream suchen und finden

| Keine Kommentare

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

Autor: Pascal

Codefieber.de wird von Pascal Betke geführt, administriert und gestaltet. Alle Inhalte sind persönlich von mir ausgewählt und erstellt, nach bestem Gewissen und Können, was die Möglichkeit von Fehlern nicht ausschließt.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.