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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.