AGB  ·  Datenschutz  ·  Impressum  







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

Umwandlung 4byte Hex zu IEEE single

Ein Thema von GPR-Man · begonnen am 7. Dez 2010 · letzter Beitrag vom 7. Dez 2010
Antwort Antwort
GPR-Man

Registriert seit: 28. Okt 2008
Ort: Zürich
14 Beiträge
 
RAD-Studio 2009 Pro
 
#1

Umwandlung 4byte Hex zu IEEE single

  Alt 7. Dez 2010, 14:27
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?
  Mit Zitat antworten Zitat
Benutzerbild von guinnes
guinnes

Registriert seit: 28. Feb 2007
Ort: Bottrop
265 Beiträge
 
Delphi 5 Enterprise
 
#2

AW: Umwandlung 4byte Hex zu IEEE single

  Alt 7. Dez 2010, 14:33
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;
Glückauf

Geändert von guinnes ( 7. Dez 2010 um 14:35 Uhr)
  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: Umwandlung 4byte Hex zu IEEE single

  Alt 7. Dez 2010, 14:38
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.
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
GPR-Man

Registriert seit: 28. Okt 2008
Ort: Zürich
14 Beiträge
 
RAD-Studio 2009 Pro
 
#4

AW: Umwandlung 4byte Hex zu IEEE single

  Alt 7. Dez 2010, 14:48
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.
  Mit Zitat antworten Zitat
GPR-Man

Registriert seit: 28. Okt 2008
Ort: Zürich
14 Beiträge
 
RAD-Studio 2009 Pro
 
#5

AW: Umwandlung 4byte Hex zu IEEE single

  Alt 7. Dez 2010, 14:53
Mit dem Befehl ReverseString klapp nun alles! Wunderbar, herzlichen Dank
  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
 
#6

AW: Umwandlung 4byte Hex zu IEEE single

  Alt 7. Dez 2010, 14:57
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.
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
GPR-Man

Registriert seit: 28. Okt 2008
Ort: Zürich
14 Beiträge
 
RAD-Studio 2009 Pro
 
#7

AW: Umwandlung 4byte Hex zu IEEE single

  Alt 7. Dez 2010, 15:42
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])^;
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:34 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