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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von Yalu X. (yalu) (Moderator)


Bewertung
0 lesenswert
nicht lesenswert
wer schrieb:
> Ah, jetzt.

Fast. Der TE wollte single precision:
s = '40400000'
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)


Bewertung
0 lesenswert
nicht lesenswert
a="40400000"

import binascii
import struct

b=binascii.unhexlify(a)
c=struct.unpack(">f", b)

print(c)


von rbx (Gast)


Bewertung
-1 lesenswert
nicht 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:
[rbx@fe1 ~]$ ghci
GHCi, version 8.6.5: http://www.haskell.org/ghc/  :? for help
Prelude> abc * 1.0

<interactive>:1:1: error:
    • Variable not in scope: abc
    • Perhaps you meant ‘abs’ (imported from Prelude)
Prelude> 'abc' * 1.0

<interactive>:2:1: error:
    • Syntax error on 'abc'
      Perhaps you intended to use TemplateHaskell or TemplateHaskellQuotes
    • In the Template Haskell quotation 'abc'
Prelude> 0xabc * 1.0
2748.0
Prelude> 

Andererseits macht der olle Interpreter aber auch ungefragt das hier:
Prelude> 0xa + 0xb
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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.

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