Frage

Ich habe ein externes Gerät, das UDP -Pakete von Binärdaten und Software ausspuckt, die auf einem eingebetteten System ausgeführt werden, das diesen Datenstrom lesen, analysiert und etwas nützliches tun muss. Die Binärdaten werden ebenfalls an einer Datei angemeldet. Ich möchte einen Parser schreiben, der die Eingabe leicht direkt aus dem UDP -Stream oder einer Datei nehmen kann, die Daten in ein bestimmtes Format analysieren und dann die Ausgabe entweder in eine Datei (z. Das wird eine Echtzeitverarbeitung erbringen. Gibt es Ressourcen, die mir dabei helfen würden, und was ist der beste Weg, dies zu tun? Ich denke, es könnte sinnvoll sein, C ++ - Streams zu verwenden, aber ich bin nicht damit vertraut, benutzerdefinierte Ausgabestreams zu erstellen. Scheint dies ein guter Ansatz zu sein oder gibt es einen besseren Weg, um es zu tun?

Vielen Dank.

War es hilfreich?

Lösung

Das Schöne an binären Daten ist, dass sie im Allgemeinen sehr fester Format sind. Eine typische Methode zum Parsen ist es, eine Struktur zu deklarieren, die auf die empfangenen Pakete ordnet und dann nur Typ-Casts verwendet wird, um die Felder als Strukturelemente zu lesen.

Die Schönheit ist, dass dies kein Parsen erfordert.

Sie müssen vorsichtig mit den Strukturpackungsregeln und der Endian-Ness sein, um die Strukturkarte genauso zu gestalten. Die Verwendung des C "Offsetof" und "Sizeof" -Makros ist nützlich, um einige Debug -Informationen auszugeben, um zu überprüfen, ob Ihre Struktur tatsächlich auf das zugeordnet wird, was Sie für ein Mapping halten.

Packungsregeln können in der Regel entweder durch Richtlinien (wie #Pragma) oder die Befehlszeilenoptionen geändert werden. Endian-Ness, mit der du festsitze. Wenn es sich von dem unterscheidet, was Ihr eingebettetes System verwendet, deklarieren Sie alle Felder als Bytes oder verwenden Sie etwas wie das "NTOH" -Makro, um den Byte -Austausch durchzuführen.

Andere Tipps

Das New Jersey Machine Code Toolkit ist ein Schema zur Dekodierung willkürlicher binärer Muster. Es wurde ursprünglich für Dekodierungsanweisungssätze entwickelt, sollte jedoch für die Dekodierungsnachrichtenformate in Ordnung sein. Sie geben eine Beschreibung des Binärformates an und synthetisiert Code, um auf die Felder dieses Formats (wenn gültig) zugreifen zu können. Daher können Sie sich auf Nachrichtenfelder mit generierten Funktionsaufrufen beziehen, anstatt darüber nachzudenken, wo sich das Feld befindet oder wie es codiert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top