String in Hex umwandeln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
inter
User
Beiträge: 13
Registriert: Dienstag 2. Februar 2016, 17:27

Hallo,

komme nicht weiter und im Netz habe ich schon einige Beispeile gefunden, jedoch keine für mich umsetzbare Lösung. Wie ich das herausgelesen habe, ist es entscheidend welche Python Version ich nutze. Benutze die 3.2.2
Zunächst bekomme ich Daten aus einer seriellen Schnittstelle. Wenn ich die Daten direkt in Hex umwandle habe ich keine Probleme. Jedoch entferne ich aus den Daten die Zeilenumbrüche "/n". Nun möchte ich den String auch in Hex umwandeln. Habe schon codecs und binascii es versucht jedoch ohne Erfolg. Wie bekomme ich den string in einen hexstring? Oder kann ich in einem Hexstring die "\n" auch entfernen?

So sieht der Hexstring ohne Formatierung/Replace aus:
b'afc54d48352d2d2d2d65485a2dc53030b2b8c58d0a8d0ab12d303a302e302e30aab2353528b230b83336b2b7b8a98d0ab12d303ab12eb82eb1aab235352830b1303939b82eb83339b1a98d0ab12d303ab22eb82eb1aab235352830b2b4b2b4b72e30b1b2b4a98d0ab12d303a39362e352e35aab2353528b8b2a98d0a302d303a39362eb12eb23535aab2353528303030b2b4b7b73635b2a98d0a218d0aafc54d48352d2d2d2d65485a2dc53030b2b8c58d0a8d0ab12d303a302e302e30aab2353528b230b83336b2'

Code: Alles auswählen

#!/usr/bin/python
#tutorialspoint.com
import serial
from time import *
import os,sys
import time
from struct import *
import binascii
import codecs

while True:
   
        ser = serial.Serial("/dev/ttyUSB0", 9600)
           
        ser.close()
        print ("serclose")
        #print (Zeichen)
                
        Input = str(Zeichen)
        print ("ohne \n:")
        
        Input = Input.replace ("\n","",5) 
        print ("Ende")
        
        ####################################################
        # 12.03.2016
        hex_zeichen = binascii.hexlify(Zeichen)
        print ("Hex:")
        print (hex_zeichen)
        print ("Ende Hex")
        print("String to hex")
        string_zeichen = hex(Input)
        #string_zeichen = codecs.encode(Input, 'hex')
        #string_zeichen = Input.decode("hex")
        #string_zeichen = binascii.hexlify(Input)
        print (string_zeichen)
        print ("Ende string")
      
Vielen Dank für euer Bemüchen im voraus.
BlackJack

@inter: Das was Du da zeigst ist kein Hexstring sondern ein Bytes-Objekt. Wir hatten das doch schon mal: In Python musst Du darauf achten ob Du Binärdaten oder Zeichenketten vorliegen hast.

Der Fehler beginnt bei ``Input = str(Zeichen)``, da wandelst Du ein Bytes-Objekt in eine Zeichenkettendarstellung um die für die Anzeige für den Programmierer gedacht ist und nicht um damit in irgendeiner Weise sinnvoll weiter zu arbeiten. Lasst das bleiben! Wandle die Bytes mit `decode()` in eine Zeichenkette um und entferne dann die Zeilenumbrüche aus der Zeichenkette, oder entferne die Zeilenumbrüche aus dem Bytes-Objekt (und wandle ggf. dann in eine Zeichenkette um).

`binascii.hexlify()` macht auf den gezeigten Daten keinen Sinn, denn da werden von der Gegenseite ja offenbar schon Hexadezimal kodierte Daten gesendet‽
inter
User
Beiträge: 13
Registriert: Dienstag 2. Februar 2016, 17:27

Hallo,

bin ein kleines Stückchen vorangekommen. Jedoch gibt es für Python sehr wenige Beispiele, an die man sich halten kann und es erklären.
Wenn ich die Bytes in die Datei (test.txt) schreibe, so bleibt ja dann noch immer das \x z.B. \xaf\xc5MH5-----eHz-\.c500 stehen. Wenn ich die Bytes mit:
[Codebox=python file=Unbenannt.py]
var_dec=var_bytes.decode("utf-8", "ignore")
>>> MH5---eHz-OOö;;....

[/Codebox]

Wie schaffe ich es, dass alle Zeichen richtig übersetzt werden? Oder kann ich über die Hex die richtigen Zeichen bekommen, die dann lesbar in der Textdatei stehen?
BlackJack

@inter: Wenn Du in einer Datei am Ende tatsächlich \x.. zu stehen hast, dann bist Du immer noch nicht weiter im Verständnis, denn wenn das in einer Datei steht hast Du etwas falsch gemacht. Zum Beispiel ein `bytes`-Objekt mit `str()` in eine Zeichenkettendarstellung umgewandelt und in eine Textdatei geschrieben.

Wie kommst Du auf die Idee UTF-8 zum dekodieren zu verwenden? Wie sind denn die Daten kodiert?

Was meinst Du mit „richtige“ Zeichen und „lesbar“? Ich denke immer noch das Du den Unterschied zwischen beliebigen Binärdaten und Text noch nicht verstanden hast und habe auch immer noch den starken Verdacht, dass Du da Binärdaten bekommst, die man nicht ”lesbar” in eine Textdatei schreiben kann. Jedenfalls nicht ohne zu wissen welche Informationen darin stecken und die in Text umzuwandeln. Und zwar nicht mit irgendeiner magischen vorhandenen Funktion, sondern in dem man das Protokoll liest und Code schreibt der die einzelnen Teile der Daten auseinander nimmt und in entsprechende Werte umwandelt.

Fang mal bitte am Anfang dieser Verarbeitungskette an und finde heraus wie die Daten strukturiert sind, die da vom Arduino kommen. Wie ist das Protokoll spezifiziert? Was bedeuten die Daten? Die einzelnen Bytes?
Antworten