Forum: PC-Programmierung Python, Hexadezimalen Eingabestring in Float nach IEEE-754 wandeln


von Matthias (Gast)


Lesenswert?

Hallo,

Ich möchte einen Hexadzimalen String, in ein Float wandeln.
z.b. "40000000" -> 2.0 / "40400000" -> 3.0
Nach IEEE 754.

Dazu findet man sehr viele Ansätze aber ich kann keinen mit dem 
gewünschten Ergebniss finden:

struct.unpack('!f', eingabestring.decode('hex'))[0]
--> String 'str' object has no attribute 'decode'

print(float.fromhex(eingabestring))
--> "40000000" -> 1073741824.0

Vielleich habt ihr eine Idee.
Schöne Grüße,
Matthias

von wer (Gast)


Lesenswert?

Matthias schrieb:
> Dazu findet man sehr viele Ansätze aber ich kann keinen mit dem
> gewünschten Ergebniss finden:

Ich kann nicht erkennen, was dein gewünschtes Ergebnis ist.

Matthias schrieb:
> z.b. "40000000" -> 2.0 / "40400000" -> 3.0
> Nach IEEE 754.

Hä?

von wer (Gast)


Lesenswert?

Ah, jetzt. Mathematische Beispiele mit einem '/' zu trennen ist 
verwirrend.
1
struct.unpack("<d", struct.pack("Q",int("0x"+hexString, 16)))[0]

von Yalu X. (yalu) (Moderator)


Lesenswert?

wer schrieb:
> Ah, jetzt.

Fast. Der TE wollte single precision:
1
s = '40400000'
2
struct.unpack('f', struct.pack('I', int(s, 16)))

Den Byte-Order-Indikator sollte man in pack und unpack gleich wählen
oder beide weglassen.

: Bearbeitet durch Moderator
von B. W. (yesitsme)


Lesenswert?

1
a="40400000"
2
3
import binascii
4
import struct
5
6
b=binascii.unhexlify(a)
7
c=struct.unpack(">f", b)
8
9
print(c)

von rbx (Gast)


Lesenswert?

Matthias schrieb:
> Ich möchte einen Hexadzimalen String, in ein Float wandeln.

ABC nach Float?
Kann man machen, macht man aber normalerweise nicht. Denn: Float ist ein 
Datentyp, der "hexstring" eher nicht, nur so ungefähr.

Gewandelt wird normalerweise  hex nach ASCII oder vom int nach float.

Darum: Suchstrategie ineffizent ;)
https://stackoverflow.com/questions/33944111/how-to-convert-int-to-float-in-python
https://stackoverflow.com/questions/209513/convert-hex-string-to-int-in-python

..
ghci-Beispiel:
1
[rbx@fe1 ~]$ ghci
2
GHCi, version 8.6.5: http://www.haskell.org/ghc/  :? for help
3
Prelude> abc * 1.0
4
5
<interactive>:1:1: error:
6
    • Variable not in scope: abc
7
    • Perhaps you meant ‘abs’ (imported from Prelude)
8
Prelude> 'abc' * 1.0
9
10
<interactive>:2:1: error:
11
    • Syntax error on 'abc'
12
      Perhaps you intended to use TemplateHaskell or TemplateHaskellQuotes
13
    • In the Template Haskell quotation 'abc'
14
Prelude> 0xabc * 1.0
15
2748.0
16
Prelude>

Andererseits macht der olle Interpreter aber auch ungefragt das hier:
1
Prelude> 0xa + 0xb
2
21

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.