Seite 1 von 1
Verarbeitung und Manipulation von HEX-Strings
Verfasst: Freitag 4. September 2020, 14:27
von Epidauros
Hallo zusammen,
ich bin ganz neu hier und beginne gerade mit Python (v.3.85).
Es geht um eine Messgerätesteuerung, bei der das Messgerät über USB nur Daten in Form von Zeichenketten wie beispielsweise
" b'\x02\x41\x31\x50\x39\x35\x41\x32\x50\x39\x35\x03' "
akzeptiert. Mein Problem ist nun, einen Eingabewert (integer oder float) in Byte 4 und 5, sowie 9 und 10 (beginnend bei 0) in dieser Zeichenfolge zu ersetzen.
Wie kann ich die Zeichenfolge in einen String verwandeln, so dass ALLE Zeichen erhalten bleiben und ich dann beispielsweise die Bytes \x39\x35 durch den Zahlenwert "87" so ersetzen, dass da \x38\x37 daraus wird?
Um diese Kombination von Hexzahlen geht es:
# zu verändernde Befehlsfolge:
Pegeleinstellung = b'\x02\x41\x31\x50\x39\x35\x41\x32\x50\x39\x35\x03'
# jetzt sollte die gesuchte Manipulation erfolgen, die das erreicht:
# Pegeleinstellung = b'\x02\x41\x31\x50\x38\x37\x41\x32\x50\x39\x35\x03'
#??
# Ausgabestring für das Messgerät (hier gibt es keine Probleme, das läuft)
ser.write(Pegeleinstellung)
Wie geht das?
Vielen Dank für Euer Kümmern!
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Freitag 4. September 2020, 16:35
von __deets__
Grundsaetzlich sind bytes einfach nur Ketten von Bytes. Das die mit Hexzahlen dargestellt werden, ist unerheblich.
Du kannst also sowas machen:
Code: Alles auswählen
pegeleinstellung = b'\x02\x41\x31\x50\x39\x35\x41\x32\x50\x39\x35\x03'
neue_einstellung = pegeleinstellung[:4] + b"\x38\x37" + ...
Aber das waere eher ungewoehnlich. Stattdessen benutzt man ueblicherweise das struct-Modul, um solche Binaerdaten zu erzeugen.
Dazu muss man aber den genauen Aufbau der Daten kennen. Hast du dazu Dokumentation?
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Freitag 4. September 2020, 17:18
von Epidauros
Soweit war ich ja auch schon, aber mein Problem ist, dass \x38\x37 hier nur ein Beispiel ist. Was ich brauche, ist die Möglichkeit diese Werte mit einer Variablen auszufüllen. Ich bekommen folgenden Input, den ich weiterverarbeiten muss:
Attn1_1=float(input("Pegel Initial Kanal1 [dBm]: -")) # Eingangswert Kanal 1
Attn2_1=float(input("Pegel Initial Kanal2 [dBm]: -")) # Eingangswert Kanal 2
Den vollständigen String habe ich hier gepostet (b'\x02\x41\x31\x50\x39\x35\x41\x32\x50\x39\x35\x03').
Bis auf die farbigen Felder sind alle anderen immer gleich.
statt:
pegeleinstellung = b'\x02\x41\x31\x50\x39\x35\x41\x32\x50\x39\x35\x03'
neue_einstellung = pegeleinstellung[:4] + b"\x38\x37" + ...
brauche ich eine Möglichkeit, die mir die beiden Ausdrücke b"\x39\x35" mit dem Wert von Attn1_1 und Attn2_1 ersetzt. Dabei kann jeweils jeder Wert zwischen 0 und 95 eingenommen werden.
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Freitag 4. September 2020, 17:20
von __deets__
Wie gesagt, dann ist das struct-Modul dein Freund. Damit wandelst du Python Datentypen in eine/deren Byte-Darstellung um. Schonmal in die Doku geschaut?
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Freitag 4. September 2020, 20:00
von Epidauros
struct ist mir noch neu; ich habe viel gesucht und probiert, bin aber bisher nicht darüber gestolpert.
Danke für den Tip!
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Samstag 5. September 2020, 08:40
von Epidauros
Puhhh,
ich habe geschaut aber vor lauter Querverweisen blicke ich da noch nicht durch. Kann mir jagend mit einem ganz kurzen Beispiel auf die Sprünge helfen?
Die Frage ist:
- wie bekomme ich meine eingaben in das struct hinein
- wie manipuliere ich einzelne Bytes
- wie bekomme ich die Daten da wieder raus, um sie über usb auszugeben
Danke an das Schwarmwissen.
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Samstag 5. September 2020, 09:48
von Sirius3
Jeder Wert wird also durch ein Byte dargestellt? Warum Wanderlust Dutt dann in float um?
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Samstag 5. September 2020, 10:33
von __deets__
Sirius3 hat geschrieben: Samstag 5. September 2020, 09:48
Warum Wanderlust Dutt dann in float um?
Ich krieg ja auch oft mal ne

Korrektur Krise, aber das ist schon fast Poesie

Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Samstag 5. September 2020, 10:50
von Epidauros
Float brauche ich, weil ich diese noch mit andern Werten im Floatingformat verrechne, bevor die Werte dann ausgegeben werden.
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Samstag 5. September 2020, 11:01
von __deets__
Du kannst ja floats auch wieder in ints umwandeln.
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Samstag 5. September 2020, 13:34
von Epidauros
Mein letzter Post mit dem vollständigen Code ist irgendwie verschwunden. Hier noch einmal in Kurzform:
Bytesequenz:
data=b'\x02A1P10A2P10\x03'
pegel1= 85 # dieser Wert soll in data [4:5] eingesetzt werden
pegel2= 37 # dieser Wert soll in data [10:11] eingesetzt werden
# eigenes struct für Eingabewerte, wie von Sirius3 vorgeschlagen:
att=struct.pack('bb', pegel1, pegel2)
# struct für die Bytesequenz:
pd=struct.pack('12s', data) # struct für die Bytesequenz
'# Ausgabe manipulierte Sequenz:
print(data[:4],att[0:1],data[6:])
Ergebnis:
der manipulierte String (data[:4],att[0:1],data[6:]) liefert (pegel2 außer Acht gelassen):
b'\x02A1P' b'U' b'A2P10\x03' # geliefert; aus dem P85 wurde P' b'U' b'
b'\x02A1P85A2P37\x03' # was ich brauche
Es ist dabei egal, ob ich (data[:4],att[0:1],data[6:]) oder (pd[:4],att[0:1],pd[6:]) einsetze, es kommt dasselbe dabei heraus.
Was mach ich da falsch, und wie wäre es richtig?
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Samstag 5. September 2020, 13:50
von __deets__
ascii 85 ist nunmal U
Das ist also schon richtig so, Python stellt die Bytes nur als \xXX dar, wenn sie nicht anders darstellbar sind.
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Samstag 5. September 2020, 17:26
von Epidauros
Ok, verstanden. Aber wie bekommt man den String so zurück, wie ich ihn benötige?
Un vor allem stören zusätzlich auch die eingefügten Kommata.
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Samstag 5. September 2020, 19:33
von Sirius3
Du mußt halt die beiden Bytestrings zusammenfügen:
Code: Alles auswählen
prefix = b'\x02A1P'
postfix = b'A2P10\x03'
data = struct.pack('4sbb6s', prefix, pegel1, pegel2, postfix)
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Montag 7. September 2020, 13:14
von Epidauros
Dank Eurer Hilfe bin nun schon viel weiter.
Als letztes suche ich eine Funktion, die mir bei einer zweistelligen Zahl, bestehend aus den Ziffern (0 .. 9) entsprechend zwei Werte hex \x30 bis x\39 liefert.
Aus der 2-stelligen Zahl kann ich die 2 Ziffern extrahieren:
pegel1h=int(pegel1/10) # Zehnerstelle
pegel1l=(pegel1 - 10*pegel1h) # Einerstelle
mit dem Beispiel 85 bekomme ich dann:
\x08\x05 anstatt wie benötigt \x38 und \x35.
Die Ziffern müssten als UTF-8 kodiert in das struct eingefügt werden, wenn ich das richtig verstehe.
Wer kann mir da helfen?
- Danke Euch!
Re: Verarbeitung und Manipulation von HEX-Strings
Verfasst: Montag 7. September 2020, 13:18
von Sirius3
Die magische Funktion nennt sich Stringformatierung: