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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.