LabVIEWForum.de - Hex, dez zu floating point umwandeln

LabVIEWForum.de

Normale Version: Hex, dez zu floating point umwandeln
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hi,
hat jemand eine Idee wie man eine Hex-Zahl in eine Fließkommazahl umwandelt/darstellt?

Bsp:
42F66B85=

Sign Bit Exponent Field Significand
0 10000101 1 .11101100110101110000101

=123.21

Ich erhalte also einen Hex-Wert. Dieser ist ein REAL32-Wert, also ein floating point. Nun müsste ich das so umwandeln, dass ich einen Dezimal-Wert erhalte.
Also mich interessiert eigentlich nur der Dezimal-Wert.

Gruß Joe
' schrieb:Bsp:
42F66B85=

Sign Bit Exponent Field Significand
0 10000101 1 .11101100110101110000101

=123.21

Ich erhalte also einen Hex-Wert. Dieser ist ein REAL32-Wert, also ein floating point. Nun müsste ich das so umwandeln, dass ich einen Dezimal-Wert erhalte.
Also mich interessiert eigentlich nur der Dezimal-Wert.

Wie erhälst du deinen Wert, als String?
Was soll da Resultat sein, ein SGL/DBL?

Ich verstehs nicht so ganz.
' schrieb:Wie erhälst du deinen Wert, als String?
Was soll da Resultat sein, ein SGL/DBL?
Ich verstehs nicht so ganz.

Nein, ich erhalte den Wert als einen INT32 (REAL32)-Wert in hex. Nicht als Strung! Der Wert vom Format REAL32 besteht aus einem
Vorzeichen Bit (Sign Bit) -> Länge: 1 Bit
Exponenten (Exponent) -> Länge: 8 Bit
Mantisse (Field Significand) -> Länge: 23 Bit

insgesamt ist die Zahl 32 Bit lang. Nach der Umrechnung sollte es dann eine Kommazahl sein, also ein DBL-Wert.
' schrieb:Nein, ich erhalte den Wert als einen INT32 (REAL32)-Wert in hex.
HEX ist eine Darstellungsform, kein Speicherformat.

Int32 ist ein Speicherformat genauso wie R32. Beide unterscheiden sich. Du kannst also nicht sagen "ich erhalte den Wert als einen INT32 (REAL32)-Wert".

Int32 kann man darstellen als HEX, DEZ, BIN etc. Auch R32 kann man darstellen - als HEX, FLOAT, BIN etc.

Ein R32 ist 32 Bit lang, da hst du recht. Auch das Format (Länge von Vorzeichen, Exponent, Mantisse) ist bekannt (ich gehe davon aus, dass das, was du angegeben hast, der Standard ist)

Uns interessiert aber: Wo kommt der Wert her? Aus einer RS232, die dann einen String liefert? Oder ist die Zahl in einem Anzeige/Bedien-Element hinterlegt vom TYP INT32, TYP SINGLE? Beachte hier "TYP"!

Also: Wie ist die Zahl gespeichert? Bedenke: HEX ist kein Speicherformat (genauso wenig wie ASCII, EBDCI etc.). Int32, Single (R32), Double (R64), String etc sind Speicherformate.
' schrieb:Hi,
hat jemand eine Idee wie man eine Hex-Zahl in eine Fließkommazahl umwandelt/darstellt?

Bsp:
42F66B85=

Sign Bit Exponent Field Significand
0 10000101 1 .11101100110101110000101

=123.21

Ich erhalte also einen Hex-Wert. Dieser ist ein REAL32-Wert, also ein floating point. Nun müsste ich das so umwandeln, dass ich einen Dezimal-Wert erhalte.
Also mich interessiert eigentlich nur der Dezimal-Wert.

Gruß Joe

Hallo Joe

Kann man nicht einfach mit rechter Maustaste->Properties->Format and Precision das Format von Hexadecimal auf Floating point umschalten?

Oder habe ich Dich nicht richtig verstanden?

BDB
' schrieb:Nein, ich erhalte den Wert als einen INT32 (REAL32)-Wert in hex. Nicht als Strung! Der Wert vom Format REAL32 besteht aus einem
Vorzeichen Bit (Sign Bit) -> Länge: 1 Bit
Exponenten (Exponent) -> Länge: 8 Bit
Mantisse (Field Significand) -> Länge: 23 Bit

insgesamt ist die Zahl 32 Bit lang. Nach der Umrechnung sollte es dann eine Kommazahl sein, also ein DBL-Wert.
Das hört sich sehr nach dem internen (binärem) Speicherformat eine Single Precision Float nach IEEE an.

http://de.wikipedia.org/wiki/Gleitkommazahl

LabVIEW speichert eine Single Precision genauso:

[attachment=12557]

Jetzt ist die Frage, wo kommt deine R32 her:
Aus einem (binärem) File, dann musst du nur das VI "Read from Binary File" nehmen.

Ansonsten per Type Cast wandeln (und es langt vollkommen, in SGL zu wandeln, mehr Info enthält deine R32 auch nicht):

[attachment=12558]

MfG, Jens
Hi,
ich danke euch allen für die Antworten bzw. Fragen. Erstmal einige Erläuterungen:

Wo kommt die Zahl her?
Die Zahl wird soll eine Temperatur darstellen und wird von einer Platine mit einem USB-to-CAN (Marke: IXXAT) ausgelesen. Zu diesem USB-to-CAN gibt es schon ein Beispielprog. im Netz. Dabei sieht die Anzeige so aus:

[attachment=12584]

Wie man sieht, gibt der USB-to-CAN im Feld "Data" Werte als Hex aus. Diese sind alle vom TYP U16. Da es insgesamt 8 Byte
(8x1 Byte) sind und ich nur die ersten 4 Byte nutzen möchte, fasse ich die 4x1 Byte zu einer Zahl (32 Bit = 4 Byte) zusammen. Nun gibt mir diese Zahl eine Temperatur, sowie Jens es beschrieben hat, an.
Und tatsächlich mit dem Symbol "Typenumformung" lässt sich die Zahl als in eine Dezimalzahl umformen.

Ich hoffe, dass es jetzt mehr verständlich ist und Sorry für die schlechte Erklärung am Anfang des Threads.

Gruß Joe
Die Vermutung von Jens kann ich nur bestätigen:
String to U32, dann Typkonvertierung zu SGL
[attachment=12592]
' schrieb:Die Vermutung von Jens kann ich nur bestätigen:
String to U32, dann Typkonvertierung zu SGL
[attachment=39829:HexToFloat.png]

Ich habe direkt eine I32-Zahl und dann Typenkonvertierung zu SGL.

Gruß Joe
' schrieb:Ich habe direkt eine I32-Zahl und dann Typenkonvertierung zu SGL.
Heißt das jetzt, daß das Problem gelöst ist, oder daß wir hier noch mit verfeinerten Vorschlägen aufwarten sollen?
Seiten: 1 2
Referenz-URLs