Buffer auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Slaxx
User
Beiträge: 6
Registriert: Donnerstag 12. März 2015, 13:52

Hallo zusammen
I habe ein UDP package das von einem C++ Programm geschickt wird. Mittlerweile habe ich es geschafft, dass es zumindest zwischendurch von meinem Python Programm empfangen werden kann. Allerdings sind die Daten in einem Buffer.
Im C++ haben die Daten folgende Form:

Code: Alles auswählen

struct packet{
    double arg1
    double arg2
    double arg3
    double arg4
    int arg5
}
Die Daten die ich im Python erhalte sind 42 bytes lang (die Länge stimmt mit der Länge der versandten Daten überein). Ich weiss allerdings noch nicht ob bevor die Daten versendet werden noch irgendwelche Operationen ausgeführt werden. Da bin ich noch dran.
Meine Frage nun: Nehmen wir an, die Daten würden 1 zu 1 in den Buffer kopiert und gesendet. Wie kann ich diese in Python wieder auslesen? (Ich benutze Python 2.7.9)

Danke schon mal im voraus
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Slaxx:
Dafür gibt es das struct-Modul in Python. Wobei die 42 Bytes nicht mit der struct-Deklaration übereinstimmen, da würde ich nur 36 bzw. 40 Bytes erwarten (je nach Alignment). Heisst da kommt mehr mit als die Daten des Structs.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wenn Du Einfluss auf das Protokoll nehmen kannst, dann würde ich Dir google Protocol Buffers empfehlen, sofern es ein Byte sparendes Format sein soll. Damit ersparst Du Dir diese Low-Level Parserei :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Alternativ vielleicht auch MessagePack. Hat ein paar Bytes mehr, dafür ist die Struktur in den Daten mitkodiert. Eine Liste mit vier Gleitkommazahlen und einer ganzen Zahl mit maximal 32 Bit ist kodiert zwischen 38 und 42 Bytes gross. 46 Bytes wenn die ganze Zahl 64 Bit gross werden darf.
Slaxx
User
Beiträge: 6
Registriert: Donnerstag 12. März 2015, 13:52

Problem wurde hier gelöst: http://stackoverflow.com/questions/2902 ... fer-decode
Falls mal jemand per Zufall auf diesen Thread stösst und eine Lösung sucht.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Slaxx:
Die Antwort von Stackoverflow beantwortet nicht die 42 Bytes.
Slaxx
User
Beiträge: 6
Registriert: Donnerstag 12. März 2015, 13:52

Es sind mittlerweile auch nur noch 40 bytes. Da ich den int auf int16_t gewechselt habe.
Thread kann aber geschlossen werden.
BlackJack

@jerch: Laut SO-Frage sind es ja auch nur noch 40 Bytes. Und die scheinen sich aus Pakettyp (2 Bytes), Paketversion (2 Bytes), laufender Zähler (2 Bytes) und dann den Nutzdaten: vier ``double``-Werte (je 8 Bytes) und einem ``short`` (2 Bytes) zusammenzusetzen.
Slaxx
User
Beiträge: 6
Registriert: Donnerstag 12. März 2015, 13:52

Genau, besser hätte ich es nicht zusammenfassen können.
Antworten