python und optimaler weg ein cmd aufzubauen

Gast #6413120
Lesenswert?

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
Gast #6413261
Lesenswert?

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.
Gast #6413332
Lesenswert?

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
...
Gast #6413395
Lesenswert?

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.
Gast #6413402
Lesenswert?

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)
Gast #6414793
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren