Forum: PC Hard- und Software python und optimaler weg ein cmd aufzubauen


von Tilo (Gast)


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

von John Doe (Gast)


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.

von Tilo (Gast)


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
...

von MaWin (Gast)


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.

von Heiner (Gast)


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)

von WerWieWas (Gast)


Lesenswert?

Klasse cmd mit den einzelnen Bits als Attributen und dann über die 
Instanz drauf zugreifen.

von Dirk (Gast)


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.

von Dirk (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.