![]() |
Zahl wieder in String umwandeln
Hallo,
für unser Programm muss ich daten aus einem alten DOS-Programm auslesen. Mit Zahlen mache ich das mit folgender Funktion:
Delphi-Quellcode:
jetzt würde ich das ganze umgekehrt benötigen. Wer kann mir dabei helfen?
function WertToFloat(pData: String; var pValue: Double): Boolean;
type tBA = packed array [0..SizeOf(Extended)-1] of byte; var Buf1: tBA; i: integer; BufR: packed record case n: integer of 0: (BA: tBA); 4: (pad4: array [1..6] of byte; sgl: single); 8: (pad8: array [1..2] of byte; dbl: double); 10: (ext: extended); end; iLen: integer; sTemp, sHex20, sHex00: String; nResult: Extended; begin sTemp := ''; if (Trim(pData) = '') then begin Result := False; pVAlue := 0; Exit; end; iLen := Length(pData); for i := iLen downto 1 do begin sTemp := sTemp + IntToHex(Ord(pData[i]), 2); sHex20 := sHex20 + '20'; sHex00 := sHex00 + '00'; end; if (sTemp = sHex20) or (sTemp = sHex00) then Exit; sTemp := LowerCase(sTemp); BufR.n := HexToBin(PChar(sTemp), @Buf1, SizeOf(Buf1)); Buf1[0] := Buf1[0] xor $80; nResult := 0; try for i := 0 to high(tBA) do BufR.BA[high(tBA)-i] := Buf1[i]; case BufR.n of 4: nResult := BufR.sgl; 8: nResult := BufR.dbl; 10: nResult := BufR.ext; else raise Exception.Create('HexToFloat conversion error'); end; nResult := nResult * -1; nResult := RoundCurrency(nResult, 4); if ABS(nResult) > 9999999999999 then begin nResult := 0; end; pValue := nResult; except on e: Exception do begin sTemp := ''; for i:= 1 to Length(pData) do begin sTemp := sTemp + IntToHex(ord(pData[i]), 2); end; end; end; end; |
AW: Zahl wieder in String umwandeln
Ohne den konkreten Quelltext jetzt im Detail studiert und/oder verstanden zu haben:
![]() |
AW: Zahl wieder in String umwandeln
AFAIK müsste der Compiler hier Warnungen ausgeben, da
Delphi-Quellcode:
und
sHex20
Delphi-Quellcode:
nicht initialisiert sind.
sHex00
Was musst du da umwandeln und warum musst du da was in Hex umwandeln? :gruebel: (sollen wir den Code jetzt mit allen möglichen Kombinationen füttern und dann per Debugger herausfinden, was da eigentlich passiert um dann dafür eine Umkehrfunktion zu schreiben?) |
AW: Zahl wieder in String umwandeln
Lokale lange Strings und dynamische Arrays werden beim Betreten der Funktion automatisch mit nil also Länge 0 initialisiert.
Deshalb gibt es keine Warnung. |
AW: Zahl wieder in String umwandeln
Als pseudocode formuliert denke ich es sollte ungefähr so aussehen:
type maxdbl:=sizeof(double); adbl = array [1..maxdbl] of byte; padbl=^adbl; case werttyp of single : for i:=1 to maxsgl do result:=result+inttohex(pasgl^[i]); double : for i:=1 to maxdbl do result:=result+inttohex(padbl^[i]); ... Gruß K-H |
AW: Zahl wieder in String umwandeln
Hallo,
nach einigen Suchen habe ich es doch gefunden. ![]()
Delphi-Quellcode:
Bei den Daten die ich auslesen muss lag es noch daran, dass der Wert mit * - 1 multipliziert werden musste.
function FloatToHex(const x: double): string; overload;
type tBA = array [0..SizeOf(x)-1] of byte; var Buf: tBA; i: integer; begin For i := 0 to high(tBA) do Buf[high(tBA)-i] := tBA(x)[i]; Buf[0] := Buf[0] xor $80; SetLength(Result,SizeOf(Buf)*2); BinToHex(@Buf,PChar(Result),SizeOf(Buf)); end; |
AW: Zahl wieder in String umwandeln
IMHO ist die Umsetzung ein Paradebeispiel für Don't do that at home
Verstehen würde ich ja die Basis-Funktionen
Delphi-Quellcode:
und
BinToFloat
Delphi-Quellcode:
um diese dann in den Wrapper-Funktionen
FloatToBin
Delphi-Quellcode:
und
HexToFloat
Delphi-Quellcode:
zu verwenden.
FloatToHex
Aber so wird das weder DRY noch KISS :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 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