AGB  ·  Datenschutz  ·  Impressum  







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

4 Bytes als Float betrachten

Ein Thema von DelphiManiac · begonnen am 22. Mär 2007 · letzter Beitrag vom 22. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2      
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#1

4 Bytes als Float betrachten

  Alt 22. Mär 2007, 11:22
Hallo,
ich habe folgendes Problem:
ich habe 4 Bytes
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
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: 4 Bytes als Float betrachten

  Alt 22. Mär 2007, 11:48
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
Klaus
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#3

Re: 4 Bytes als Float betrachten

  Alt 22. Mär 2007, 11:50
Hi Kalus01,

danke für deine Antwort,
was macht denn das absolute?
FloatValue: Single absolute IntValue; THX
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: 4 Bytes als Float betrachten

  Alt 22. Mär 2007, 11:55
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
Klaus
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.057 Beiträge
 
Delphi XE2 Professional
 
#5

Re: 4 Bytes als Float betrachten

  Alt 22. Mär 2007, 12:04
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.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#6

Re: 4 Bytes als Float betrachten

  Alt 22. Mär 2007, 12:25
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
case integer ?

@Klaus01:
muss das mal ausprobieren (was hast du denn auf japanischen Websites zusuchen??
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: 4 Bytes als Float betrachten

  Alt 22. Mär 2007, 12:37
Zitat von DelphiManiac:
was macht jetzt genau die Case Struktur mit
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
Klaus
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.057 Beiträge
 
Delphi XE2 Professional
 
#8

Re: 4 Bytes als Float betrachten

  Alt 22. Mär 2007, 14:49
Zitat von DelphiManiac:
Danke euch beiden,

@Amateurpofi:

was macht jetzt genau die Case Struktur mit
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
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#9

Re: 4 Bytes als Float betrachten

  Alt 22. Mär 2007, 15:45
@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
Problem gelöst
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: 4 Bytes als Float betrachten

  Alt 22. Mär 2007, 16:02
Äh...
  Move (@IntegerVariable, @SingleVariable, SizeOf (Integer)); Und zurück:
  Move (@SingleVariable, @IntegerVariable, SizeOf (Integer));
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  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:15 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