Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Umwandlung 4byte Hex zu IEEE single (https://www.delphipraxis.net/156568-umwandlung-4byte-hex-zu-ieee-single.html)

GPR-Man 7. Dez 2010 15:27

Umwandlung 4byte Hex zu IEEE single
 
Von einem seriellen Gerät wird ein String gesendet: ½áG®. Den kann ich problemlos in hex umwandeln (mit IntToHex(Ord(x)) für jedes byte): BDE147AE, komme dann aber nicht mehr weiter:(. Schlussendlich sollte er aber in ein IEEE Single umgewandelt werden. In diesem Falle sollte das -0.11 sein. Wie wandle ich nun den String ½áG® in ein Single um?

guinnes 7. Dez 2010 15:33

AW: Umwandlung 4byte Hex zu IEEE single
 
Nimm einen VariantenRecord :
Delphi-Quellcode:
Type
  TByteToSingle = Record
    Case Integer of
      1 : (TheBytes : Array[0..3] of Byte);
      2 : (TheSingle : Single);
    end;


Var
  MyRec : TByteToSingle;
Begin
  MyRec.TheBytes[0] := Dein1.Byte;
  MyRec.TheBytes[1] := Dein2.Byte;
...
  Result := MyRec.TheSingle;

Neutral General 7. Dez 2010 15:38

AW: Umwandlung 4byte Hex zu IEEE single
 
Hallo,

Du hast also einen String?

Guck mal:

Delphi-Quellcode:
uses
  StrUtils; // Für ReverseString

procedure TForm1.FormCreate(Sender: TObject);
var tmp: Single;
    str: AnsiString;
begin
  str := '½áG®';
  str := ReverseString(str);
  tmp := PSingle(@str[1])^;
  Caption := FloatToStrF(tmp,ffNumber,3,2);
end;
Weiß nicht wie du den String reinbekommst. Wenns bei dir in der Praxis nicht funktioniert, dann lass das ReverseString mal weg.

Nachtrag: Wenn du die Daten auch als Bytes/Byte-Array o.ä. bekommst, dann wäre so ein Varianten-Record wie guinnes es vorgeschlagen hat natürlich eleganter.

GPR-Man 7. Dez 2010 15:48

AW: Umwandlung 4byte Hex zu IEEE single
 
Danke, das habe ich gesehen und auch eingehende ausgetestet: BDE147AE (oder die bytes 189 225 71 174) ergeben bei mir aber -4.54478572831096E-11 und nicht -0.11. In die andere Richtung klappt es mit IntToHex(PInteger(@single)^,8) problemlos aber die Umwandlung zu single stimmt leider einfach nicht.

GPR-Man 7. Dez 2010 15:53

AW: Umwandlung 4byte Hex zu IEEE single
 
Mit dem Befehl ReverseString klapp nun alles! Wunderbar, herzlichen Dank

Neutral General 7. Dez 2010 15:57

AW: Umwandlung 4byte Hex zu IEEE single
 
Machs bitte NICHT mit ReverseString wenn du die Daten auch als Bytes vorliegen hast.
ReverseString ist nur dafür da, dass aus BDE147AE, AE47E1BD wird.

Kannst du mal ein bisschen Code zeigen, damit wir sehen wie du die Daten erhältst?
Dann könnte man eine ideal(ere) Lösung finden.

GPR-Man 7. Dez 2010 16:42

AW: Umwandlung 4byte Hex zu IEEE single
 
Ich erhalte die Daten als AnsiString in einer Variabeln Packet.Data (aus einem Event). Daraus lese ich am richtigen Offset die Daten aus und wandle sie um, das ist schon alles:
Delphi-Quellcode:
    strIn := Copy(Packet.Data,intOffset,4);
    strIn := ReverseString(strIn);
    sngResult := PSingle(@strIn[1])^;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz