AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mal wieder HexToFloat

Offene Frage von "Neutral General"
Ein Thema von echitna · begonnen am 6. Jul 2017 · letzter Beitrag vom 15. Sep 2017
Antwort Antwort
Seite 1 von 2  1 2      
echitna

Registriert seit: 3. Jan 2005
Ort: Clausthal-Zellerfeld
25 Beiträge
 
Delphi XE5 Professional
 
#1

Mal wieder HexToFloat

  Alt 6. Jul 2017, 09:19
Hallo,

ich habe folgendes Problem:
Ich bekomme über eine Schnittstelle einen String, der eine Hexadezimalzahl repräsentiert (4 Zeichen lang), also z.B. 'FF E4' oder '00 03'.
Dieser String muss jetzt in einen Gleitkommawert umgewandelt werden. Ich habe eine Funktion dafür, die den Wert in binärstring
umwandelt so dass dann die Mantisse und der Exponent ausgerechnet werden kann. Die Funktion gibt dann das Ergebnis der Rechnung result := mantisse * power(2,exponent) aus. Das Problem ist jetzt, dass ich mit der Funktion eine normalisierte Zahl (also z.B. 9.17963e-41) als Ergebnis bekomme, ich hätte aber gerne eine 'normale' Kommazahl (also z.B. 0,00000917).
Hat jemand eine Idee wie man das hinkriegt, oder gibt es vielleicht sogar noch eine einfachere Methode einen Hex-String in eine Kommazahl zu konvertieren?

(Tante Google hat mir leider auch nicht geholfen)
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#2

AW: Mal wieder HexToFloat

  Alt 6. Jul 2017, 09:33
Was soll das für ein Format sein? 4 Hex-Zeichen sind 16-Bit, das ist ein Format, das ungeöhnlich ist (single hat 32-Bit). Ohne Dokumentation des internen Aufbaus des 16-Bit-Wortes kann man wohl wenig sagen oder helfen.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Mal wieder HexToFloat

  Alt 6. Jul 2017, 09:38
Du kannst folgendes machen:
Delphi-Quellcode:
function HexToSingle(hex: String): Single;
var tmp: Cardinal;
begin
  tmp := StrToInt('$' + hex);
  Move(tmp, Result, SizeOf(Cardinal));
end;

var f: Single;
begin
  f := HexToSingle('FFE4');
  Caption := FloatToStr(f);
end;
Prinzipiell kannst du mit FloatToStrF oder Format die Zahl (wenn du sie als String ausgeben willst) auf X Nachkommastellen formatieren.
Hinweis: 9.17963e-41 ist NICHT 0,00000917. Die Darstellung "9.17963e-41" wird benutzt, weil die Zahl ausgeschrieben so aussehen würde:

0,0000000000000000000000000000000000000000917963
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#4

AW: Mal wieder HexToFloat

  Alt 6. Jul 2017, 10:08
Du kannst folgendes machen:
Delphi-Quellcode:
function HexToSingle(hex: String): Single;
var tmp: Cardinal;
begin
  tmp := StrToInt('$' + hex);
  Move(tmp, Result, SizeOf(Cardinal));
end;
Ich glaube nicht, daß das so gewollt ist. Das Ergebnis ist immer ein denormalisiertes Single. Außerdem kann man so keine negativen Zahlen erhalten. Wie wäre es mit
Delphi-Quellcode:
function HexToSingle(hex: String): Single;
var tmp: smallint;
begin
  tmp := StrToInt('$' + hex);
  Result := tmp;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Mal wieder HexToFloat

  Alt 6. Jul 2017, 12:07
Wie wäre es mit
Delphi-Quellcode:
function HexToSingle(hex: String): Single;
var tmp: smallint;
begin
  tmp := StrToInt('$' + hex);
  Result := tmp;
end;
Eh ja, so gehen alle Nachkommastellen verloren und die Zahl ist komplett falsch.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

AW: Mal wieder HexToFloat

  Alt 6. Jul 2017, 13:27
Eh ja, so gehen alle Nachkommastellen verloren und die Zahl ist komplett falsch.
Welche Nachkommastellen? Wie schon gesagt: Solange keine Auskunft über die Bedeutung der 4 Hex-Zeichen gemacht wird (zB: nimm den Integerwert/100), sehe ich erst einmal keine Nachkomnastellen. Deine Nachkommastellen sind doch völlig sinnlos, wenn man bedenkt, daß die kleinste normalisierte Singlezahl ca 1.17549e-38 ist und damit ca 128 mal größer(!) als 9.17963e-41. Und das gilt für jede vierstellige Hexeingabe.
  Mit Zitat antworten Zitat
echitna

Registriert seit: 3. Jan 2005
Ort: Clausthal-Zellerfeld
25 Beiträge
 
Delphi XE5 Professional
 
#7

AW: Mal wieder HexToFloat

  Alt 7. Jul 2017, 19:57
Du kannst folgendes machen:
Delphi-Quellcode:
function HexToSingle(hex: String): Single;
var tmp: Cardinal;
begin
  tmp := StrToInt('$' + hex);
  Move(tmp, Result, SizeOf(Cardinal));
end;

var f: Single;
begin
  f := HexToSingle('FFE4');
  Caption := FloatToStr(f);
end;
Prinzipiell kannst du mit FloatToStrF oder Format die Zahl (wenn du sie als String ausgeben willst) auf X Nachkommastellen formatieren.
Hinweis: 9.17963e-41 ist NICHT 0,00000917. Die Darstellung "9.17963e-41" wird benutzt, weil die Zahl ausgeschrieben so aussehen würde:

0,0000000000000000000000000000000000000000917963
Sorry, war nur zu faul die vielen nullen zu tippen
  Mit Zitat antworten Zitat
echitna

Registriert seit: 3. Jan 2005
Ort: Clausthal-Zellerfeld
25 Beiträge
 
Delphi XE5 Professional
 
#8

AW: Mal wieder HexToFloat

  Alt 7. Jul 2017, 20:00
Vielen Dank für die vielen Tipps. Dann werde ich wohl mal eingiges ausprobieren wenn ich wieder dazu komme.
  Mit Zitat antworten Zitat
SirNox

Registriert seit: 15. Sep 2017
2 Beiträge
 
#9

AW: Mal wieder HexToFloat

  Alt 15. Sep 2017, 09:12
Hallo zusammen,

ich war gerade auch auf der Suche nach dieser Routine und hab vor diesen Forum folgendes gefunden:

https://gregstoll.dyndns.org/~gregstoll/floattohex/

Dort ist auch Code in anderer Sprache zu finden.

Ich hab die Hexwerte von Netzwerkprotokoll (BACnet) dort getestet und funktioniert:

0100 .... = Application Tag Number: Real (ANSI/IEE-754 floating point) (4)

present-value: 417.500000 (Real)
Hexwert: 43D0C000

Vielleicht bringt es was.
  Mit Zitat antworten Zitat
echitna

Registriert seit: 3. Jan 2005
Ort: Clausthal-Zellerfeld
25 Beiträge
 
Delphi XE5 Professional
 
#10

AW: Mal wieder HexToFloat

  Alt 7. Jul 2017, 19:56
Was soll das für ein Format sein? 4 Hex-Zeichen sind 16-Bit, das ist ein Format, das ungeöhnlich ist (single hat 32-Bit). Ohne Dokumentation des internen Aufbaus des 16-Bit-Wortes kann man wohl wenig sagen oder helfen.
Ja das ist leider ein ungewöhnliches Format, aber laut der Doku zu dem Gerät das ich anspreche ist das so verwendet. Ich habe es auch mit einem Port-Monitor geprüft, es werden wirklich nur vier Hex-Zeichen gesendet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz