![]() |
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 |
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:
Oder Mantisse, Exponent usw. einzeln in Hex-Schreibweise übertragen?
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; Was von den Java-ähnlichen Typenhelfern wie (3.14.toString()) in Delphi 7 schon ging weiß ich nicht.
Delphi-Quellcode:
scheint ein paar Helfermethoden für Gleitkommazahlen zu haben...
System.TSingleRec
Oh und Herzlich Willkommen in den Heiligen Hallen des Wissens und des Wahnsinns :hi::corky: |
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:
gibt aber kein
IntToHex()
Delphi-Quellcode:
;-)
FloatToHex()
|
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.
|
AW: Float Zahlen in Hex Zahlen umwandeln
Stimmt, das
Delphi-Quellcode:
-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.
absolute
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; |
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; |
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; |
AW: Float Zahlen in Hex Zahlen umwandeln
Noch'n Vorschlag:
Delphi-Quellcode:
Gruß
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; K-H |
AW: Float Zahlen in Hex Zahlen umwandeln
Zitat:
|
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:
PS.: der Ton spielt die Musik. Ich habe kein Problem damit, wenn man mich auf Fehler hinweist. Die Frage ist nur Wie!... 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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 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