Python - Unterschied zwischen 2 Strings

OP #5708506
Lesenswert?

Hallo, ich habe ein sehr merkwürdiges Problem. Ich schreibe in Python 
Daten über die serielle Schnittstelle an einen Empfänger. Dafür müssen 
verschiedene Verarbeitungsschritte gemacht werden, um den String zu 
erhalten, der gesendet werden soll.
Nun ist es so, dass ich den zusammengebauten String über print ausgeben 
lasse, um zu prüfen, ob er auch korrekt ist.

Der String sieht so aus:
\x02\x00\x1B\x07\x00\x00\x00\x00\x00\x00\x00\x32\x00\x14\x00\x05\x00\x68 
\x6F\x6C\x6C\x61\x3B\x2A\x03

Durch die print Ausgabe sieht er auch genau so aus. Wenn ich ihn so über 
die serielle Schnittstelle übertrage, passiert beim Empfänger auch nicht 
das, was passieren soll.

Kopiere ich den String und weiße ihn direkt einer Variable zu:
thestring = "\x02\x00\x......."

Dann sieht die print Ausgabe so aus, dass die Hex Werte in Zeichen 
umgewandelt werden. Sende ich die Daten dann über die serielle 
Schnittstelle, passiert beim Empfänger das was passieren soll.

Also was ist jetzt der Unterschied zwischen diesen beiden Strings ?

Der Empfänger ist eine LED Schriftanzeige. Der String ist eine Nachricht 
in einem bestimmten Format. Er enthält einen Präfix, Attribute, die 
eigentliche Nachricht und einen CRC Wert.
Wie gesagt, die Nachricht ist an sich korrekt.
Moderator #5708554
Lesenswert?

Sebastian S. schrieb:
> Kopiere ich den String und weiße ihn direkt einer Variable zu:
> thestring = "\x02\x00\x......."
>
> Dann sieht die print Ausgabe so aus, dass die Hex Werte in Zeichen
> umgewandelt werden.

Ja, ein \x in einem Stringliteral zeigt an, dass die nächsten beiden
Zeichen als Hexzahl interpretiert werden sollen, und alle 4 Zeichen
(hier: \x02) ergeben letzendlich ein einzelnes Zeichen, dessen
Zeichencode der angegebene Hexawert ist. So ist bspw. "\x41" exakt der
gleiche String wie "A".

> Der String sieht so aus:
> \x02\x00\x1B\x07\x00\x00\x00\x00\x00\x00\x00\x32\x00\x14\x00\x05\x00\x68
> \x6F\x6C\x6C\x61\x3B\x2A\x03

Wenn die Ausgabe mit print so aussieht, bedeutet das, dass er nicht die
Zeichen "\x02", "\x00" usw. enthält sondern die Zeichen "\", "x", "0",
"2" usw.

Du hast also bei der Generierung dieses Strings etwas falsch gemacht.
Beitrag #5708561 wurde von einem Moderator gelöscht.
Moderator #5708799
Lesenswert?

Dirk B. schrieb:
> Yalu X. schrieb:
>> Ja, ein \x in einem Stringliteral zeigt an, dass die nächsten beiden
>> Zeichen als Hexzahl interpretiert werden sollen,
>
> Nein, es sind alle folgenden gültigen HExziffern. Nicht nur zwei.

In C ist das so.

Und wohl auch in Python-Versionen aus Zeiten, an die ich mich nicht
mehr erinnern kann ;-)

In nicht ganz so alten Pythons (m.W. ab 2.1) gibt es \x.., \u.... und
\U........ für zwei-, vier- und achtstellige Zeichencodes.

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