C# (UDP Paket) Byte Array aufteilen - Schleifenlogik

max_1234

Captain
Registriert
Feb. 2012
Beiträge
3.682
Ich hab grad ein kleines Hängerchen, vllt. kann mir jemand mit folgendem auf die Sprünge helfen :)

Ich bekomme ein UDP-Paket, welches ich in ein Byte-Array einlese - so weit so gut.
Das Byte-Array kann ich problemlos mit BitConverter.ToString bzw. mit Encoding.UTF8.GetString ausgeben.

Mir geht es allerdings um die Aufteilung ... Folgendes Byte Array ist nur ein Beispiel.

FF-FF-FF-FF-3D-3D-00-53-68-69-6E-6F-00-00-00-00-00-C0-C8-8F-46-00-3D-47-4F-3D-4D-61-64-5F-44-6F-67-00-00-00-00-00-3C-BA-0A-46-00-4E-61-73-68-20-42-72-69-64-67-65-73 (...)

Die grün markierten Bereiche sind von der Länge her natürlich nicht fixiert, sonst könnte ich mit Take() und Skip() arbeiten.
Gleichzeitig muss ich, je nach Richtung des Durchlaufs, jeweils die 5 0x00 Bytes skippen.
Egal was ich versucht habe - es hat nie wirklich geklappt. Mir graut es vor einer profesorischen RegEx Lösung aus dem Encoding.UTF8.GetString ...

Folgendes habe ich u.a. versucht:
- For-Schleife für jedes Byte
- Prüfung wenn aktuelles Byte = 0x00 ob index -/+ 1, 2, 3 (etc.) auch 0x00 ist -> skip
- Ansonsten in List<byte> gesichert, nach nächstem 0x00 Abschnitt Liste geleert und Inhalt in string-Array gesichert

Hat jemand Erfahrung damit wie man das möglichst effektiv umsetzen kann? :)

mfg,
Max
Ergänzung ()

Hab nun ne feine Lösung entdeckt ...

Code:
        public byte[][] Separate(byte[] source, byte[] separator)
        {
            var Parts = new List<byte[]>();
            var Index = 0;
            byte[] Part;
            for (var I = 0; I < source.Length; ++I)
            {
                if (Equals(source, separator, I))
                {
                    Part = new byte[I - Index];
                    Array.Copy(source, Index, Part, 0, Part.Length);
                    Parts.Add(Part);
                    Index = I + separator.Length;
                    I += separator.Length - 1;
                }
            }
            Part = new byte[source.Length - Index];
            Array.Copy(source, Index, Part, 0, Part.Length);
            Parts.Add(Part);
            return Parts.ToArray();
        }

        bool Equals(byte[] source, byte[] separator, int index)
        {
            for (int i = 0; i < separator.Length; ++i)
                if (index + i >= source.Length || source[index + i] != separator[i])
                    return false;
            return true;
        }

mfg,
Max
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben