Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 4 Bytes als Float betrachten (https://www.delphipraxis.net/88867-4-bytes-als-float-betrachten.html)

DelphiManiac 22. Mär 2007 10:22


4 Bytes als Float betrachten
 
Hallo,
ich habe folgendes Problem:
ich habe 4 Bytes
Delphi-Quellcode:
Byte1,Byte2,Byte3,Byte4:Byte
diese Bytes will ich also Floatzahl bewerten nach IEEE 754.
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:
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^;
Desweiteren muss ich ja die Floatzahl auch wieder rückrechnen können.. bzw genau die 4 Bytes, die eine Floatzahl darstellen

Danke, ich hoffe es antworten mir ein paar Spezis :-)

Klaus01 22. Mär 2007 10:48

Re: 4 Bytes als Float betrachten
 
Es sollte damit gehen.

Delphi-Quellcode:
function HexToSingle(Value: String): Single;
 var
   IntValue: Integer;
   FloatValue: Single absolute IntValue;
 begin
   IntValue:=StrToInt('$'+Value);
   Result:=FloatValue;
 end;
[edit] mal wieder zu schnell gepostes und nicht alles gelesen, der Weg zurück geht damit auch nicht [/edit]

Grüße
Klaus

DelphiManiac 22. Mär 2007 10:50

Re: 4 Bytes als Float betrachten
 
Hi Kalus01,

danke für deine Antwort,
was macht denn das absolute?
Delphi-Quellcode:
FloatValue: Single absolute IntValue;
THX

Klaus01 22. Mär 2007 10:55

Re: 4 Bytes als Float betrachten
 
Noch auf einer japanischen WebSeite gefunde,

Delphi-Quellcode:
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;
zu absolute:
Zitat:

You can create a new variable that resides at the same address as another variable. To do so, put the directive absolute after the type name in the declaration of the new variable, followed by the name of an existing (previously declared) variable. For example,

var

Str: string[32];
StrLen: Byte absolute Str;

specifies that the variable StrLen should start at the same address as Str. Since the first byte of a short string contains the string’s length, the value of StrLen is the length of Str.
You cannot initialize a variable in an absolute declaration or combine absolute with any other directives.
Grüße
Klaus

Amateurprofi 22. Mär 2007 11:04

Re: 4 Bytes als Float betrachten
 
Zitat:

Zitat von DelphiManiac
Hallo,
ich habe folgendes Problem:
ich habe 4 Bytes
[delphi]
Byte1,Byte2,Byte3,Byte4:Byte

diese Bytes will ich also Floatzahl bewerten nach IEEE 754.
Denke der Datentyp Single ist schon IEEE 754 konform.
Habe es bisher (aber natürlich nicht sonderlich gut oder elegant) so
gelöst

so müßte es funktionieren:

Code:
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;
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.

DelphiManiac 22. Mär 2007 11:25

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?? :-)

Klaus01 22. Mär 2007 11:37

Re: 4 Bytes als Float betrachten
 
Zitat:

Zitat von DelphiManiac
was macht jetzt genau die Case Struktur mit
Delphi-Quellcode:
case integer
?

Das case ist dazu da damit man im Record verschiedene Typen auf
ein und demselben Adressraum abbilden kann.
Kannst ja mal in der Delphi Hilfe nach variant Records schauen.

Grüße
Klaus

Amateurprofi 22. Mär 2007 13:49

Re: 4 Bytes als Float betrachten
 
Zitat:

Zitat von DelphiManiac
Danke euch beiden,

@Amateurpofi:

was macht jetzt genau die Case Struktur mit
Delphi-Quellcode:
case integer
?

Die case Struktur bewirkt, daß du unterschiedliche Datentypen ansprechen kannst
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

DelphiManiac 22. Mär 2007 14:45

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 :-)

alzaimar 22. Mär 2007 15:02

Re: 4 Bytes als Float betrachten
 
Äh...
Delphi-Quellcode:
  Move (@IntegerVariable, @SingleVariable, SizeOf (Integer));
Und zurück:
Delphi-Quellcode:
  Move (@SingleVariable, @IntegerVariable, SizeOf (Integer));


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:55 Uhr.
Seite 1 von 2  1 2      

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