Python konvertierung von int in ein einziges Byte, welches an String angehängt werden kann.

Gast #6950152
Lesenswert?

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

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

Vielen Dank für eure Antworten,
1
l = 5 + 4
2
print(l)
3
print(int.to_bytes(l,1,'big'))      --> b'\t'
4
tx_bytes.append(struct.pack("B",l)) --> b'\t'
5
print(l.to_bytes(1,'big'))          --> b'\t'
6

7
aber:
8
l = 5
9
print(l)
10
print(int.to_bytes(l,1,'big'))      --> b'\x05'
11
tx_bytes.append(struct.pack("B",l)) --> b'\x05'
12
print(l.to_bytes(1,'big'))          --> b'\x05'

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

Matthias schrieb:
> ich kann das mit dem b'\t' nicht verstehen:

man ascii
1
       Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
2
       ────────────────────────────────────────────────────────────────────────
3
       000   0     00    NUL '\0' (null character)   100   64    40    @
4
       001   1     01    SOH (start of heading)      101   65    41    A
5
       002   2     02    STX (start of text)         102   66    42    B
6
       003   3     03    ETX (end of text)           103   67    43    C
7
       004   4     04    EOT (end of transmission)   104   68    44    D
8
       005   5     05    ENQ (enquiry)               105   69    45    E
9
       006   6     06    ACK (acknowledge)           106   70    46    F
10
       007   7     07    BEL '\a' (bell)             107   71    47    G
11
       010   8     08    BS  '\b' (backspace)        110   72    48    H
12
       011   9     09    HT  '\t' (horizontal tab)   111   73    49    I
Gast #6952755
Lesenswert?

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

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

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.
1
>>> type(chr(9))
2
<class 'str'>
Gast #6954152
Lesenswert?

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

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

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.

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