Hallo zusammen,
ich versuche seit Stunden folgendes Python-Problem zu lösen.
Für ein serielles Protokoll soll eine Reihe an Bytes zusammengebaut
werden.
Das Protokoll ist folgendermaßen definiert:
#1. Byte = 0x55
#2. Byte = ID
#3. Byte = Len (data + 5Bytes)
#4. Byte = Transmit-DATA
#5. Byte = CRC16 (2Bytes)
Der zusammengesetzte Datensatz soll dann über sie serielle schnittstelle
abheschickt werden.
Nun scheitere ich beim einsetzen von Len.
Mein bisheriger ansatz war:
transmit_data = "TEST"
tx_bytes = ""
tx_bytes = tx_bytes + bytes.fromhex('55').decode('utf-8')
print(tx_bytes) #Ausgabe : U -->Korrekt!
l = len(transmit_data)+5 # Ausgabe : 9 (int) -->Korrekt
#hier müsste ich nun irgendeine Möglichkeit finden die 9 (int) in ein
einziges Byte b'\x09' umzuwandeln, welches dann an tx_bytes angehängt
werden kann.
Jedoch sehe ich keine möglichkeit wie es gelingen kann, mit
format(l,'x'), encode, hex....
Habe ich es vielfach mit verschiedenen Lösungsansätzen versucht, jedoch
bekomme ich immer nur Fehlermeldungen dass eine der Konvertierungen
nicht möglich ist.
Es wäre wirklich sehr, sehr schön wenn jemand eine Idee hätte wie die
int 9 in ein einziges Byte b'\x09', tatsächlich dargestellt in nur einem
einzigen Byte, nicht als String in Python umgewandelt und dem String
angehängt werden kann.
Diese vermutlich eine Zeile hat mich nun schon ~3Stunden beschäftigt und
ich bin bisher nur in Sackgassen geraten.
Schonmal vielen Dank für eure Vorschläge,
Matthias
Du kannst auch t.to_bytes(1,byteorder='big') benutzen. (Warum bei einem
Byte die Byteorder angegeben werden muss kann man natürlich
hinterfragen^^)
Wenn die Geschwindigkeit eine Rolle spielt, wäre ich bei VNnn:
struct.pack("B", t)
Aber Laufzeit Geschichten sind ja eh erst mal eine andere Geschichte.
MaWin. schrieb:> MaWin. schrieb:>> b'\t>> oh, da ist beim Kopieren das abschließende ' verlorengegangen. Aber ich> denke es ist verständlich, was gemeint war.
Brauchst Dich nicht zu rechtfertigen. Diese Art von Pfusch erwarte ich
einfach von Dir.
ich kann das mit dem b'\t' nicht verstehen:
Dez: 116 / HEX : 74 / Bin : 01110100
Was soll dass mit 9 zu tun haben?
9 wäre für mich:
Dez: 9 / HEX : 9 / Bin : 00001001
Könnt ihr mir erklären wie man auf '\t' kommen kann?
-->Rolfs Ansatz probier ich gleoch aus...
Die 255 in der Variable I speichern:
I = 255
Datentyp von I prüfen:
Type(I)
Also I ist eine Int-Variable.
Dann diese dreistellige Zahl 255 in ein Byte speichern,
255 ist ja die größte Zahl die in ein Byte reinpast:
By = chr(I)
Prüfen ob By wirklich nur ein einzelnes Byte ist:
len(By)
Ja, ist es, mit der int Zahl 255, oder hex Zahl FF.
von Matthias schrieb:
>Es wäre wirklich sehr, sehr schön wenn jemand eine Idee hätte wie die>int 9 in ein einziges Byte
Lösung:
By = chr(9)
Das ganze wider rückgängig machen:
ord(By)
Günter LenzDeine graphik sagt mit nichts, da ist n schrieb im Beitrag
#6952755:
> Prüfen ob By wirklich nur ein einzelnes Byte ist:> len(By)
Das bedeutet nicht, dass By genau ein Byte groß ist. Len gibt nicht die
Größe eins Objekts in Bytes an, sondern die Anzahl an Elementen eines
Containers. By ist ein String, und da steht ein Zeichen drin. Setz mal I
auf 1000 und wiederhole das ganze.
Günter LenzDeine graphik sagt mit nichts, da ist n schrieb im Beitrag
#6952755:
> Lösung:> By = chr(9)
Die Lösung ist aber leider falsch, weil kein bytes rauskommt, sondern
ein str.
von Matthias schrieb:
>Es wäre wirklich sehr, sehr schön wenn jemand eine Idee hätte wie die>int 9 in ein einziges Byte b'\x09', tatsächlich dargestellt in nur einem>einzigen Byte, nicht als String in Python umgewandelt und dem String>angehängt werden kann.
Welche Python Version benutzt du?
Python2.7 unterscheidet nicht zwischen Byte und String, da
ist alles das selbe. Da funktioniert es so wie ich es oben
schon beschrieben habe. Ich habe da mal etwas experimentiert.
Mit Python3 funktioniert es so nicht mehr. Da bin ich selber
auch noch am knobeln.
von Rolf M. schrieb:
>Setz mal I>auf 1000 und wiederhole das ganze.
Bei Python2.7 kommt dann eine Fehlermeldung, da funktioniert
es nur bis 255.
Bei Python3 kommt keine Fehlermeldung,
ist aber als Datentyp Byte nicht zu gebrauchen, auch nicht
mit 255.
Günter LenzDeine graphik sagt mit nichts, da ist n schrieb im Beitrag
#6954152:
> Python2.7 unterscheidet nicht zwischen Byte und String,
Python 2 ist seit über 2 Jahren End-of-Life.
Das nutzt hoffentlich niemand mehr freiwillig.
> Da bin ich selber auch noch am knobeln.
Mehrere Lösungen stehen hier im Thread.
Günter LenzDeine graphik sagt mit nichts, da ist n schrieb im Beitrag
#6954152:
> von Rolf M. schrieb:>>Setz mal I>>auf 1000 und wiederhole das ganze.>> Bei Python2.7 kommt dann eine Fehlermeldung, da funktioniert> es nur bis 255.
Python 2 habe ich aus meinem Repertoire gestrichen.
> Bei Python3 kommt keine Fehlermeldung,> ist aber als Datentyp Byte nicht zu gebrauchen, auch nicht> mit 255.
Ich würde generell nicht auf die Idee kommen, Strings zum Speichern von
Binärdaten zu missbrauchen.