Forum: PC-Programmierung Python - Unterschied zwischen 2 Strings


von Sebastian S. (dualsbiker)


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.

von Yalu X. (yalu) (Moderator)


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.

: Bearbeitet durch Moderator
Beitrag #5708561 wurde vom Autor gelöscht.
von Dirk B. (dirkb2)


Lesenswert?

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.

Bei der Oktalnotierung sind es maximal drei Ziffern.

von Dirk B. (dirkb2)


Lesenswert?

Sebastian S. schrieb:
> Nun ist es so, dass ich den zusammengebauten String über print ausgeben
> lasse,

Wie baust du den String zusammen?

von Markus (Gast)


Lesenswert?

'\x02' sieht eher nach einem UTF-8 Problem aus.

von Dirk B. (dirkb2)


Lesenswert?

Markus schrieb:
> '\x02' sieht eher nach einem UTF-8 Problem aus.

'\x02' ist das Zeichen mit dem Wert 2. Das ist noch ASCII.
Hat da den Namen STX (start of Text). Am Ende ist die 3 für ETX.
Das \x1B ist ESC.

Das passt schon

von Sebastian S. (dualsbiker)


Lesenswert?

Ach ich bin doch ein Dussel. Ich erzeuge in dem String das \x indem ich 
es mit "\\x" schreibe. Ich habe das Problem jetzt anders gelöst. Ich 
arbeite bei der Berechnung des Strings mit den Dezimalzahlen der 
Zeichen. Ich wandle die jetzt einfach mit chr() um. Nu gehts.
Danke für eure Inspiration.

von Nico W. (nico_w)


Lesenswert?

Guck dir mal das binutil Paket an. Das ist recht mächtig und auch 
schnell.

von Keiner N. (nichtgast)


Lesenswert?

Du kannst dir auch mal struct.pack anschauen. Damit kannst du auch 
binäre daten in einen String quetschen.

von Yalu X. (yalu) (Moderator)


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.

von Max D. (max_d)


Lesenswert?

Python bietet für genau diesen Zweck das bytes Datenformat.
b"Test" liefert dir so ein Objekt.

von Dirk B. (dirkb2)


Lesenswert?

Yalu X. schrieb:
> In C ist das so.
>
> Und wohl auch in Python-Versionen aus Zeiten, an die ich mich nicht
> mehr erinnern kann ;-)

Danke.

Ich hatte extra online nachgesehen.
Da stand dann dabei, dass es genauso wie in C ist. Und auch als \hh...

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.