Seite 2 von 2

Re: Kommunikation mit Serial Port

Verfasst: Mittwoch 9. März 2016, 20:28
von inter
Was ich nicht verstehe, warum wird hier es richtig angezeigt ? [Codebox=python file=Unbenannt.py]
Print "H\x42llo"
Hallo
[/Codebox]

Könnte es daran liegen, dass ich in str() umwandle und in die Datei dann schreibe? Wenn ich es aber nicht in str() kommt folgende Meldung:
Can't convert 'bytes' object to str imlicity

Re: Kommunikation mit Serial Port

Verfasst: Mittwoch 9. März 2016, 20:56
von BlackJack
@inter: Uh, jetzt bringst Du auch noch Zeichenketten und Bytes ”durcheinander”. Das 'a' wird ausgegeben weil 42 der Hexadezimalwert des ASCII-Zeichens 'a' ist. Das *kann* man ausgeben. Was sollte denn Deiner Meinung nach mit Bytewerten passieren die man nicht als ASCII-Zeichen darstellen kann? Da wäre es für den Programmierer doch praktisch zu wissen welchen *Wert* die haben. Und genau das passiert bei der b'…'-Repräsentation. Damit man sehen kann was da tatsächlich für Werte enthalten sind.

Wenn Du Binärdaten in eine Datei schreiben willst, dann musst Du die als *Binärdatei* öffnen. Wenn Du sie als *Textdatei* öffnest, dann musst Du auch *Text*, also Zeichenketten, rein schreiben. Oder Du bekommst halt eine Ausnahme wenn Du versuchst Bytes hinein zu schreiben. Ist umgekehrt genau so: Öffnest Du eine Datei als Binärdatei, gibt's eine Ausnahme wenn Du versuchst Zeichenketten hinein zu schreiben.

Re: Kommunikation mit Serial Port

Verfasst: Mittwoch 9. März 2016, 21:49
von inter
Danke für deine Antwort. Nehmen wir an, ich möcht die Daten als Txt speichern. Wie bekomme ich aus den Daten einen Text in der richtigen Anzeige? Kann das Python überhaupt? Habe bisher in C programmiert, da war das mit den Datentypen klarer.

Re: Kommunikation mit Serial Port

Verfasst: Mittwoch 9. März 2016, 22:26
von BlackJack
@inter: Bei C ist das mit den Datentypen *unklarer*, genau deswegen hast Du jetzt Probleme. Für C ist letztendlich alles eine Zahl. Und C macht keinen Unterschied zwischen Bytes und ”Zeichen”. Letzteres in Anführungszeichen weil C gar keinen Datentyp für Text hat. `char` wird für ”Zeichen” und Byte-Werte verwendet. Text ist dann einfach eine Bytefolge in irgendeiner Kodierung.

Python 3 unterscheidet zwischen Bytefolgen (Datentyp `bytes`) und Zeichenketten (Datentyp `str`) und die kann man nicht einfach austauschen wie bei C, denn es ist ja letztendlich auch etwas unterschiedliches. Wenn Bytedaten als Textdatei speichern willst, dann musst Du sie irgendwie in Text umwandeln. Also in Zeichen. *Wie*, das hängt davon ab was die Bytedaten bedeuten. Wenn das Text in einer bekannten Kodierung ist, dann musst Du sie dekodieren, mit eben dieser Kodierung, um Zeichenketten zu bekommen die man in eine Textdatei schreiben kann. Wenn das beliebige Binärdaten sind, dann kannst Du sie in Hexadezimaldarstellung mit zwei Zeichen pro Byte umwandeln, oder als Base64 kodieren, oder …. Es kommt halt darauf an was der Sinn der Umwandlung sein soll, also was Du mit den Daten später machen willst. Wie gesagt: Schau Dir dir das `binascii`-Modul für allgemeine Umwandlungsfunktionen für Binärdaten in ASCII und zurück an.