![]() |
4 Bytes als Float betrachten
Hallo,
ich habe folgendes Problem: ich habe 4 Bytes
Delphi-Quellcode:
diese Bytes will ich also Floatzahl bewerten nach IEEE 754.
Byte1,Byte2,Byte3,Byte4:Byte
Denke der Datentyp Single ist schon IEEE 754 konform. Habe es bisher (aber natürlich nicht sonderlich gut oder elegant) so gelöst
Delphi-Quellcode:
Desweiteren muss ich ja die Floatzahl auch wieder rückrechnen können.. bzw genau die 4 Bytes, die eine Floatzahl darstellen
data1:=IntToHex(device1.FT_In_Buffer[3],2);
data2:=IntToHex(device1.FT_In_Buffer[4],2); data3:=IntToHex(device1.FT_In_Buffer[5],2); data4:=IntToHex(device1.FT_In_Buffer[6],2); ReadValueString:='$'+data1+data2+data3+data4; data:=StrToInt(ReadValueString); ReadValueString:= HexStringToStr(ReadValueString); PointerSingle:=@data; FLOATWERT:=PointerSingle^; Danke, ich hoffe es antworten mir ein paar Spezis :-) |
Re: 4 Bytes als Float betrachten
Es sollte damit gehen.
Delphi-Quellcode:
[edit] mal wieder zu schnell gepostes und nicht alles gelesen, der Weg zurück geht damit auch nicht [/edit]
function HexToSingle(Value: String): Single;
var IntValue: Integer; FloatValue: Single absolute IntValue; begin IntValue:=StrToInt('$'+Value); Result:=FloatValue; end; Grüße Klaus |
Re: 4 Bytes als Float betrachten
Hi Kalus01,
danke für deine Antwort, was macht denn das absolute?
Delphi-Quellcode:
THX
FloatValue: Single absolute IntValue;
|
Re: 4 Bytes als Float betrachten
Noch auf einer japanischen WebSeite gefunde,
Delphi-Quellcode:
zu absolute:
function SingleToHex(d: single) : String;
var i: Cardinal absolute d; begin Result := IntToHex(i,8); end; function HexToSingle(h: String): Single; var i: Cardinal; s: Single absolute i; begin i := StrToIntDef(h, 0); Result := s; end; Zitat:
Klaus |
Re: 4 Bytes als Float betrachten
Zitat:
Code:
Du kannst die Daten als Bytes, Words, Integer oder Cardinal in data schreiben und dann mit data.value den Wert als single auslesen, ohne irgenwelche weiteren Operationen.
Type
TSingle= packed Record case integer of 1 : (byte1,byte2,byte3,byte4:byte); 2 : (word1,word2:word); 3 : (int:integer); 4 : (lword:cardinal); 5 : (bytes:array[0..3] of byte); 6 : (words:array[0..1] of word); 7 : (value:single); end; var data:TSingle; |
Re: 4 Bytes als Float betrachten
Danke euch beiden,
@Amateurpofi: Ok ich versuche mich mal dran. Also wir haben einen neuen Datentypen TSingle, dieser bildet ein gepackten (also alles hintereinander) Record. was macht jetzt genau die Case Struktur mit
Delphi-Quellcode:
?
case integer
@Klaus01: muss das mal ausprobieren (was hast du denn auf japanischen Websites zusuchen?? :-) |
Re: 4 Bytes als Float betrachten
Zitat:
ein und demselben Adressraum abbilden kann. Kannst ja mal in der Delphi Hilfe nach variant Records schauen. Grüße Klaus |
Re: 4 Bytes als Float betrachten
Zitat:
z.B. data.byte1:=5; // byte1 wird = 5 gesetzt, andere Bytes bleiben unberührt data.int:=5; // alle 4 Bytes werden verändert, in diesem Fall byte1 = 5 alle anderen = 0 data.value:=37.5 // 37.5 wird als Single-Wert gespeichert |
Re: 4 Bytes als Float betrachten
@Amateurprofi:
Das heißt ich kann eine 32 Bit Speicherstelle über den Datentyp des records ansprechen? Das wäre dann ja genau das was ich suche, so kann ich meine Speicherstelle füllen und den Datentyp (der die Speicherstelle ja interpretiert) auswählen. SUPER DANKE!!! Danke auch nocheinmal allen, die sich mit mir den Kopf zerbrochen haben :o Problem gelöst :-) |
Re: 4 Bytes als Float betrachten
Äh...
Delphi-Quellcode:
Und zurück:
Move (@IntegerVariable, @SingleVariable, SizeOf (Integer));
Delphi-Quellcode:
Move (@SingleVariable, @IntegerVariable, SizeOf (Integer));
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 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-2025 by Thomas Breitkreuz