![]() |
Großer Hex-String in Dezimal String wandeln, rundungsfehler
Hallo
Ich muss Hex-Strings dieser größe: E0169402086427A9 ins Dezimal-System wandeln. (E0169402086427A9 -> 16147256250435119017). Dafür habe ich eine Funktion geschrieben die soweit funktioniert. Wird jedoch in der Anwendung ein neues Fenster erstellt, oder z.B. die Funkion LoadFromFile ausgeführt, wird während der Berechnung automatisch gerundet (1 Stelle geht verloren) und das neue Ergebnis lautet: 1614725625043512000 Wäre froh wenn mir jemand dabei helfen könnte. Ich habe schon eine Lösung über die Compiler-Schalter gesucht, aber auch ohne erfolg. Aufruf z.B. mit: MessageDLG(RFIDHexToNummer('E0169402086427A9'),mtI nformation,[mbOK],0);
Delphi-Quellcode:
function RFIDHexToNummer(karte:string):string;
var s:string; z:extended; begin //Karte z.B.: E0169402086427A9 s:=Karte; z:=hexstrtoextended(s); s:=floattostrf((z/100),ffGeneral,22,0); s:=s+floattostrf((round(frac(z/100)*100)),ffGeneral,22,0); result:=s; end; Function HexStrToExtended(s1:String):extended; Var d1:extended; i:Integer; hexhelp:array[0..15] of extended; x:integer; Begin debugschreiben('###############################'); hexhelp[0]:=1; hexhelp[1]:=16; hexhelp[2]:=256; hexhelp[3]:=4096; hexhelp[4]:=65536; hexhelp[5]:=1048576; hexhelp[6]:=16777216; hexhelp[7]:=268435456; hexhelp[8]:=4294967296; hexhelp[9]:=68719476736; hexhelp[10]:=1099511627776; hexhelp[11]:=17592186044416; hexhelp[12]:=281474976710656; hexhelp[13]:=4503599627370496; hexhelp[14]:=72057594037927936; hexhelp[15]:=1152921504606846976; d1:=0; trim(s1); for i:= length(s1)-1 downto 0 do begin case s1[length(s1)-i] of '0': x:=0; '1': x:=1; '2': x:=2; '3': x:=3; '4': x:=4; '5': x:=5; '6': x:=6; '7': x:=7; '8': x:=8; '9': x:=9; 'A': x:=10; 'B': x:=11; 'C': x:=12; 'D': x:=13; 'E': x:=14; 'F': x:=15; end; d1:=d1+(hexhelp[i]*x); end; result:=d1; end; |
Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh
Herzlich willkommen in der Delphi-PRAXiS, ruedi.
Vielleicht kannst du dein Problem umgehen, indem du die Funktion StrToInt64() einsetzt:
Delphi-Quellcode:
Freundliche Grüße vom marabu
var
hex: string; i: Int64; begin hex := 'E0169402086427A9'; i := StrToInt64('$'+ hex); ShowMessage(IntToStr(i)); end; |
Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh
Danke für die rasche Antwort, aber hast du dein Lösungsvorschlag auch getestet. Bie mir funktioniert deine Variante nicht. Ich glaube darum, weil der Int64 zu klein für die richtige Lösung ist???
|
Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh
Hallo ruedi,
getestet hatte ich nicht - sorry.
Delphi-Quellcode:
Freundliche Grüße
var
hex: string; i: Int64; begin hex := 'E0169402086427A9'; i := StrToInt64('$'+ hex); ShowMessage(IfThen(IntToHex(i, 16) = hex, 'cheerio', 'rats')); end; |
Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh
Hallo Marabu...
Leider komme ich mit deiner letzten Antwort überhaupt nicht klar. Was meinst du mit cheerio bzw. rats? Wie hilft mir das weiter? |
Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh
Zitat:
|
Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh
Hallo ruedi,
kennst du denn die Funktion IfThen() nicht? Wenn der Testcode "cheerio" ausgibt, dann funktioniert die round trip conversion mittels Int64. Wird "rats" ausgegeben, dann habe ich heute mein erstes Problem. Bei einem Hex-String mit 16 Nibbles = 8 Bytes dürfte ein Int64 (64 Bit = 8 Byte) noch keine Probleme haben. Irgendwann kann es ein Vorzeichenproblem bei der Zahlendarstellung geben, aber intern bleibt es beim QuadWord. Freundliche Grüße |
Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh
Und was ist wenn der Int64 nun doch nicht reicht... wie in unserem Fall... oder mach ich was falsch? wenn ich es so umwandle, wie du as vorgeschlagen hast, dann ist das ergebnis: -2299487823274432599
mfg |
Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh
Hallo ruedi,
sobald deine Hex-Strings größer als der größte interne Datentyp werden, kannst du HexToBin() einsetzen. In deinem Beitrag #1 hattest du nichts davon geschrieben, dass die Hex-Strings länger als 16 Zeichen werden könnten. Tut mir leid, wenn ich dich da auf einen Holzweg geführt haben sollte. Um so etwas zu vermeiden musst du dein technisches Problem genauer (Wertebereiche etc.) beschreiben. Wenn dir das schwer fällt, dann hilft manchmal auch die Beschreibung des fachlichen Problems. Oft findet sich dann jemand, der sich in der fachlichen Domäne zu Hause fühlt. Das Ergebnis für dein Hex-Beispiel ist tatsächlich -2299487823274432599. Int64 wertet das höchste Bit als Vorzeichen-Bit, sodass die Darstellung dich vielleicht irritiert. Intern ist die Umwandlung natürlich korrekt gelaufen. Wozu brauchst du das Ergebnis? Warum ist eine Darstellung als Ganzzahl notwendig? Freundliche Grüße |
Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh
Also meine Problemstellung ist folgende:
Ich arbeite an einem Zutrittssysten und habe ein serielles Lesegerät das die UNC-Nummer von RFID/Transponder Karten ausliest. Diese UNC-Nummer bekomme ich vom Gerät im HEX-Format wie z.B. E0169402086427A9 (es sind immer 16 Nibbels) Mein Problem ist nun, dass ich Karten von anderen Systemen importiere (übers Internet) und verwalten muss. Alle anderen Systeme verwenden diese Kartennummer im Dezimalformat: E0169402086427A9 -> 16147256250435119017 Eine Umwandlung der Nummer 16147256250435119017 ins Hex-Format geht ebenfalls nicht, da die Karten schon mit der Nummer im Dezimal-Format beschriftet sind und das die Kunden verwirren würde. Meine Funktion, ganz oben im Thema, funktioniert soweit, nur nach bestimmten anderen Aufrufen im Programm (Application.CreateForm, LoadFromFile) funktioniert die Umwandlung nicht mehr bzw. beginnt automatisch mit dem Runden und ich erhalte das Ergebnis 1614725625043512000. Kurz gesagt: ich muss Zahlen im Hex-Format mit 16 Nibbels im Dezimal-Format darstellen! Vielleicht kannst du mir auch sagen, wieso Delphi so lange kein application.createForm aufgerufen wird korrekt rechnet und nacher nicht mehr??? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:26 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 by Thomas Breitkreuz