AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Float Zahlen in Hex Zahlen umwandeln
Thema durchsuchen
Ansicht
Themen-Optionen

Float Zahlen in Hex Zahlen umwandeln

Offene Frage von "danielA"
Ein Thema von satfer · begonnen am 5. Dez 2013 · letzter Beitrag vom 6. Dez 2013
Antwort Antwort
Seite 1 von 3  1 23      
satfer

Registriert seit: 24. Mai 2013
Ort: Bürs
1 Beiträge
 
Delphi 7 Professional
 
#1

Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 12:06
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
Ferhat
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.155 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 12:23
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. System.TSingleRec scheint ein paar Helfermethoden für Gleitkommazahlen zu haben...


Oh und Herzlich Willkommen in den Heiligen Hallen des Wissens und des Wahnsinns

Geändert von Der schöne Günther ( 5. Dez 2013 um 12:33 Uhr) Grund: Fix: Hexwerte immer zweistellig
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 12:23
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
IntToHex() gibt aber kein
FloatToHex()
Philip
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#4

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 12:36
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.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.155 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 12:38
Stimmt, das 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;
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 12:50
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;
  Mit Zitat antworten Zitat
danielA

Registriert seit: 10. Jun 2002
Ort: Hamburg
72 Beiträge
 
Delphi XE7 Enterprise
 
#7

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 12:56
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;

Geändert von danielA ( 5. Dez 2013 um 12:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 13:19
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#9

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 13:22
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.
  Mit Zitat antworten Zitat
danielA

Registriert seit: 10. Jun 2002
Ort: Hamburg
72 Beiträge
 
Delphi XE7 Enterprise
 
#10

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 14:04
@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!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      

 

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