Hi wie löst man am besten in python folgendes Problem: ich muss über sockets/TCPIP/UDP comamndos an mein embedded device schicken. Die cmds sind wie folgt aufgebaut: cmd = bytearray([ 0x01, 0x02, 0x04, #protocol header 3 byte 0x00,0x20, # version (Int16) 0x00, 0x0e, # cmd 0x02, my id 0x00, # Priority (Int8))] Also ein struct in c aber in python? Wie wurde ich am besten Bitflder dadrin definieren? in C wären es ja #defines. Danke
hi, ich weiß nicht ob das optimal ist, aber es gibt struct.pack(). ich glaube das ist relativ schnell Wenn du eine Liste hast payload=[b"x01",b"\x02",b"x04",\ 32,\ 4711] kannst du die so als 3bytes und 2shorts in Binärdaten wandeln: struct.pack("3c2h",*payload) Wenn du einen festen Sendebuffer hast, wäre struct.pack_into() sinnvoll.
hi es ging darum dass ich sowas wie ein struct habe, wo jedes byte einen namen hat. Damit ich halbwegs lesbar auf die einzelnen bytes zugreifen kann: sowas wie: cmd.header = 0x123456 cmd.version = 0x888 ...
Da Datentypen aus 3 byte Quatsch sind und unalignte 16 bit eventuell lieber wordalignt gespeichert werden, nützt dir eine struct nichts. Nimm lieber das bytearray und schreibe dir eine Hineinpackfunktion.
Tilo schrieb: > es ging darum dass ich sowas wie ein struct habe, wo jedes byte einen > namen hat. Das wäre ctypes.Structure. Von dieser abstrakten Basisklasse leitest du deine eigene Klasse ab, überschreibst dabei
1 | _fields_ |
und bekommst dann genau das, was du möchtest. Beispiel: https://stackoverflow.com/questions/10346375/how-do-i-properly-declare-a-ctype-structure-union-in-python (Die akzeptierte Antwort)
Klasse cmd mit den einzelnen Bits als Attributen und dann über die Instanz drauf zugreifen.
Ich würde eine Klasse mit Decorator erstellen und den Datentypen @test.serializable class Mydata: header: uint32 cmdversion: uint16 usw. In der Methode serialzable kannst Du dann alle Properties durchgehen und auf die Datentype prüfen und entsprechend mit struct.pack packen.
>http://sunilarora.org/serializable-decorator-for-python-class/
Hier ein Beispiel, aber nicht für deine geforderten Typen. Es soll nur
das Prinzip erklären.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.