Byte Pattern Splitten und Finden

  • C#
  • .NET (FX) 1.0–2.0

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Byte Pattern Splitten und Finden

    Hallo Community,

    Ich habe folgendes Problem.
    Ich habe ein ausgangs byte[] mit ein paar bytes darin.

    Nun wird in mein ausgangs bytearray irgendwo folgendes eingefügt: ein neues byte[] und zwar sagen wir:

    C#-Quellcode

    1. 0x01,0x02,0x03, 0xbla, oxbla, oxBlabla 0x01,0x02,0x03


    Ich möchte nun in diesem byte array anhand der grenzen

    C#-Quellcode

    1. 0x01, 0x02, 0x03 ... 0x01, 0x02, 0x03
    die daten dazwischen rausfiltern, also in dem fall:

    C#-Quellcode

    1. 0xbla, oxbla, oxBlabla


    Kann man das irgendwie mit regex oder so machen? :|
    Es muss nämlich die edingung zutreffen das die drei bytes davor =

    C#-Quellcode

    1. 0x01,0x02,0x03
    sind und dann 3 bytes was anderes und dann wieder drei bytes danach mit

    C#-Quellcode

    1. 0x01,0x02,0x03


    Wenn das zutrifft dann soll der inhalt dazwischen zurückgegeben werden.
    C# Developer
    Learning C++
    Ich würde ne Methode basteln, die ein int[] zurückgibt und zwei byte[] als Parameter erwartet. Das erste byte[] zum durchsuchen, das zweite als Pattern.
    Wenn du nun die Methode aufrufst, dann gibt sie die die Indices des ersten Elements des Patterns im ganzen Byte-Array zurück. Bei dir also new[] {0, 6}
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Ich will jetzt keine Eigenwerbung machen, aber in OnUtils hab ich Funktionen drin, die dafür genau richtig wären (Siehe Extensions-Namespace). Du kannst gerne das Projekt herunterladen und den Code anschauen.

    C#-Quellcode

    1. byte[] Source = ...;
    2. IEnumerable<int> Delimiters = Source.AllIndicesOf(new byte[] {1, 2, 3});
    3. // Da fehlen mir jetzt die Details. Kann das genau einmal vorkommen und immer mit exakt 3 Bytes dazwischen? Dann so:
    4. byte[] Content = Source.SubSequence(Delimiters[0] + 3, 3);

    Von Hand ginge es zwar effizienter, aber etwas weniger flexibel:

    C#-Quellcode

    1. byte[] Source = ...;
    2. byte[] Content = new byte[3];
    3. for (int i = 0; i < Source.Length - 2; i++)
    4. {
    5. if (Source[i] = 1 && Source[i + 1] = 2 && Source[i + 2] = 3)
    6. {
    7. Content[0] = Source[i + 4];
    8. Content[1] = Source[i + 5];
    9. Content[2] = Source[i + 6];
    10. break;
    11. }
    12. }
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils