Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Float Zahlen in Hex Zahlen umwandeln (https://www.delphipraxis.net/177913-float-zahlen-hex-zahlen-umwandeln.html)

satfer 5. Dez 2013 11:06

Float Zahlen in Hex Zahlen umwandeln
 
Hallo Leute,

ich hab folgendes Problem. Ich steuere einen Schunk Servogreifer per Profibus an und muss
die Parameter in Hex übertragen. Dass Problem ist, es muss eine float-hex umwandlung sein sonst akzeptiert
der Greifer die Parameter nicht. Ich hab jetzt lang genug gesucht und nix gefunden.
Kann mir da jemand weiterhelfen?

Umwandlung Float zu Hex

Der schöne Günther 5. Dez 2013 11:23

AW: Float Zahlen in Hex Zahlen umwandeln
 
Profibus habe ich bislang immer erfolgreich vor mir her geschoben, kenne mich damit also nicht aus. Wie will er die Fließkommazahlen haben? Einfach die Bytes nach IEEE 754-Notation in Hex-Form?

Beispielsweise so?

Delphi-Quellcode:
procedure TForm5.FormCreate(Sender: TObject);
var
   float: Single;
   byteNo: Integer;
begin

   float := System.Pi();

   self.Caption := float.ToString()+'=';
   for byteNo := 0 to Pred(float.Size()) do
      self.Caption := self.Caption + float.Bytes[byteNo].ToHexString(2);

end;
Oder Mantisse, Exponent usw. einzeln in Hex-Schreibweise übertragen?


Was von den Java-ähnlichen Typenhelfern wie (3.14.toString()) in Delphi 7 schon ging weiß ich nicht.
Delphi-Quellcode:
System.TSingleRec
scheint ein paar Helfermethoden für Gleitkommazahlen zu haben...


Oh und Herzlich Willkommen in den Heiligen Hallen des Wissens und des Wahnsinns :hi::corky:

Darlo 5. Dez 2013 11:23

AW: Float Zahlen in Hex Zahlen umwandeln
 
Hi,

kann ja sein, dass ich jetzt komplett daneben liege, aber meines Wissens sind Hex-Zahlen nur Integer.....

Sollte ich hier richtig liegen dann macht es Sinn, dass es
Delphi-Quellcode:
IntToHex()
gibt aber kein
Delphi-Quellcode:
FloatToHex()
;-)

gammatester 5. Dez 2013 11:36

AW: Float Zahlen in Hex Zahlen umwandeln
 
Single belegen vier Bytes. Ich nehme an, daß diese 4 Bytes als $xx, $xx, $xx, $xx übertragen werden sollen. Damit bliebe nur die Fragen der Endianness / Endigkeit / Bytereihefolge zu klären. Die Bytes erhält man via variante Records oder per absolute.

Der schöne Günther 5. Dez 2013 11:38

AW: Float Zahlen in Hex Zahlen umwandeln
 
Stimmt, das
Delphi-Quellcode:
absolute
-Keyword wär auch noch eine Möglichkeit. Hier aber nochmal mit einem Byte-Pointer der über die Single-Variable wandert, ist ja im Endeffekt das gleiche. Und macht mir persönlich weniger Angst.

Und ja, Big- oder Little-Endian müsste auch noch geklärt werden...

Delphi-Quellcode:
procedure TForm5.FormCreate(Sender: TObject);
var
   float: Single;
   byteNo: Integer;

   bytePtr: PByte;

   numHexDigits: Integer;
begin

   float := System.Pi();
   numHexDigits := 16 div (Byte.Size()*8);

   self.Caption := float.ToString()+'=';
   for byteNo := 0 to Pred(float.Size()) do
      self.Caption := self.Caption + float.Bytes[byteNo].ToHexString(numHexDigits);


   memo1.Lines.Append(float.ToString()+' entspricht...');
   bytePtr := Addr(float);
   for byteNo := 0 to Pred(float.Size()) do begin
      memo1.Lines.Append(bytePtr^.ToString() + ' = 0x'+bytePtr^.ToHexString(numHexDigits));
      Inc(bytePtr);
   end;


end;

gammatester 5. Dez 2013 11:50

AW: Float Zahlen in Hex Zahlen umwandeln
 
Mit Delphi 7 wird das so nicht gehen. Sicher und ohne Angst kann man es so machen (mit write als Ersatz für Sende_Hex):
Delphi-Quellcode:
type
  TSingleByteArray = packed array[0..3] of byte; {Single as array of bytes}
var
  s: single;
  i: integer;
begin
  s := 1.12;
  for i:=0 to 3 do write(TSingleByteArray(s)[i]:4);
end;

danielA 5. Dez 2013 11:56

AW: Float Zahlen in Hex Zahlen umwandeln
 
Probier mal folgendes:

Code:

...

type
  TConvert32Bit = (Conv_AsFloat, Conv_AsInteger, Conv_AsByte, Conv_AsChar, Conv_AsSingle);

  TConvertRecord = record
  case TConvert32Bit of
       Conv_AsFloat  : (FloatValue : Double);
       Conv_AsInteger : (IntValue : Integer);
       Conv_AsByte   : (ByteHH, ByteHL, ByteLH, ByteLL : Byte);
       Conv_AsChar   : (CharHH, CharHL, CharLH, CharLL : Char);
       Conv_AsSingle : (HighSingle, LowSingle : Single);
  end;


  TForm1 = class(TForm)


...


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var ConvertVar : TConvertRecord;
    FloatValue : Real;
begin
  FloatValue := 0.0;
  ConvertVar.FloatValue := FloatValue;
  ShowMessage(IntToHex(ConvertVar.IntValue, 8));

  FloatValue := 1234.1234;
  ConvertVar.FloatValue := FloatValue;
  ShowMessage(IntToHex(ConvertVar.IntValue, 8));
end;

p80286 5. Dez 2013 12:19

AW: Float Zahlen in Hex Zahlen umwandeln
 
Noch'n Vorschlag:
Delphi-Quellcode:
var
  i : integer;
  a : single;
  b : double;
  pa : pbytearray;
  dummy : string;
begin
  dummy:='';
  a:=1/3+4;
  b:=a;

  memo1.Lines.Add(format('%-3.6g',[a]));
  memo1.Lines.Add(format('%-3.6g',[a]));

  dummy:='';
  pa:=@a;
  for i:=0 to sizeof(a)-1 do
    dummy:=dummy+inttohex(pa^[i],2)+' ';
  memo1.Lines.Add(dummy);

  dummy:='';
  pa:=@b;
  for i:=0 to sizeof(b)-1 do
    dummy:=dummy+inttohex(pa^[i],2)+' ';
  memo1.Lines.Add(dummy);

end;
Gruß
K-H

gammatester 5. Dez 2013 12:22

AW: Float Zahlen in Hex Zahlen umwandeln
 
Zitat:

Zitat von danielA (Beitrag 1238613)
Probier mal folgendes:

Code:

...

type
  TConvert32Bit = (Conv_AsFloat, Conv_AsInteger, Conv_AsByte, Conv_AsChar, Conv_AsSingle);

  TConvertRecord = record
  case TConvert32Bit of
       Conv_AsFloat  : (FloatValue : Double);
...

Damit kann man kein Single konvertieren. Es kommt zwar was raus, aber es ist völliger Schrott.

danielA 5. Dez 2013 13:04

AW: Float Zahlen in Hex Zahlen umwandeln
 
@Gammatester

Dein Arroganter Kommentar zeigt mir, dass du das Prinzip welches ich hier zeigen wollte definitiv nicht begriffen hast bzw. nicht kennst!
Sonst hättest du mich sicher auf den Fehler hinweisen können!
Im übrigen kosten Typecasts ne Menge Zeit und sind bei so einer einfachen umwandlung schlichtweg überflüssig!

@An den Rest
ich habe mich leider beim Byteszählen vertan. Hier nun noch einmal die berichtigte Variante

Code:


...

type
  TConvert32Bit = (Conv_AsFloat, Conv_AsInteger, Conv_AsByte, Conv_AsChar, Conv_AsCardinal);

  TConvertRecord = record
  case TConvert32Bit of
       Conv_AsFloat : (FloatValue : Single);
       Conv_AsInteger : (IntValue : Integer);
       Conv_AsByte  : (ByteHH, ByteHL, ByteLH, ByteLL : Byte);
       Conv_AsChar  : (CharHH, CharHL, CharLH, CharLL : Char);
       Conv_AsCardinal : (CardinalValue : Cardinal);
  end;


  TForm1 = class(TForm)


...


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var ConvertVar : TConvertRecord;
    FloatValue : Single;
begin
  FloatValue := 0.0;
  ConvertVar.FloatValue := FloatValue;
  ShowMessage(IntToHex(ConvertVar.IntValue, 8));

  FloatValue := 1234.1234;
  ConvertVar.FloatValue := FloatValue;
  ShowMessage(IntToHex(ConvertVar.IntValue, 8));
end;
PS.: der Ton spielt die Musik. Ich habe kein Problem damit, wenn man mich auf Fehler hinweist. Die Frage ist nur Wie!


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 Uhr.
Seite 1 von 3  1 23      

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