probleme mit struct.unpack() und float

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
Christian L
User
Beiträge: 2
Registriert: Mittwoch 21. November 2012, 05:34

Hallo Leute,
Ich bin noch ein absoluter Neuling in Python und stehe jetzt vor dem Problem einen hex Wert in eine float Wert umzuwandeln.
Der Wert den ich umwandeln will sieht so aus 4369074c , der passende float dazu ist 233.02850341796875.
Wenn ich jetzt per Hand \x43\x69\x07\x4c draus mache bekomme ich mit unpack('>f' , ... auch den richtigen Wert. Ich hab schon versucht mit list() die einzelnen Zeichen zu extrahieren und mir den richtigen String zusammen zu bauen, (mit \x ) bekomme mit diesem String aber nur Fehlermeldungen.

Was mache ich hier falsch, das kann doch eigentlich nicht so schwer sein.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Zeig was du versucht hast und wie die Fehlermeldungen lauten.
Denk daran, dass \ in Zeichenketten maskiert werden müssen.
BlackJack

@Christian L: Die Darstellung einer Zeichenkette mit ``\x`` ist eben nur das: eine Darstellung. Die Zeichenkette '\x40' enthält weder einen Backslash, noch ein 'x' noch eine '4' oder eine '0', sondern nur *ein* Byte/Zeichen nämlich das '@' (wenn man sie als ASCII interpretiert):

Code: Alles auswählen

In [56]: s = '\x40'

In [57]: len(s)
Out[57]: 1

In [58]: 'x' in s
Out[58]: False

In [59]: print s
@

In [60]: s == '@'
Out[60]: True

In [61]: s
Out[61]: '@'
Die Schreibweise ist für Zeichenkettenliterale in Python-Quelltext. Es funktioniert nicht eine Zeichenkette die tatsächlich diese Sequenzen als Zeichenfolge enthält zu erstellen und zu hoffen das aus magische Weise aus den jeweils vier Zeichen, also auch vier Bytes, jeweils ein Zeichen/Byte wird.

Du hast eine Zeichenkette mit 8 Zeichen aus denen Du vier Bytes machen musst. Schau mal in das `binascii`-Modul in der Standardbibliothek, da gibt es entsprechende Funktionen.
Christian L
User
Beiträge: 2
Registriert: Mittwoch 21. November 2012, 05:34

danke für die hinweise.

Code: Alles auswählen

>>> import struct , binascii
>>> x= '4369074c'
>>> struct.unpack('>f',binascii.unhexlify(x))
(233.02850341796875,)
genau das hab ich gesucht.
Antworten