AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Großer Hex-String in Dezimal String wandeln, rundungsfehler
Thema durchsuchen
Ansicht
Themen-Optionen

Großer Hex-String in Dezimal String wandeln, rundungsfehler

Ein Thema von ruedi · begonnen am 2. Jul 2007 · letzter Beitrag vom 2. Jul 2007
Antwort Antwort
Seite 1 von 2  1 2      
ruedi

Registriert seit: 2. Jul 2007
6 Beiträge
 
Delphi 7 Enterprise
 
#1

Großer Hex-String in Dezimal String wandeln, rundungsfehler

  Alt 2. Jul 2007, 09:51
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;
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh

  Alt 2. Jul 2007, 10:00
Herzlich willkommen in der Delphi-PRAXiS, ruedi.

Vielleicht kannst du dein Problem umgehen, indem du die Funktion StrToInt64() einsetzt:

Delphi-Quellcode:
var
  hex: string;
  i: Int64;
begin
  hex := 'E0169402086427A9';
  i := StrToInt64('$'+ hex);
  ShowMessage(IntToStr(i));
end;
Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat
ruedi

Registriert seit: 2. Jul 2007
6 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh

  Alt 2. Jul 2007, 10:22
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???
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh

  Alt 2. Jul 2007, 10:30
Hallo ruedi,

getestet hatte ich nicht - sorry.

Delphi-Quellcode:
var
  hex: string;
  i: Int64;
begin
  hex := 'E0169402086427A9';
  i := StrToInt64('$'+ hex);
  ShowMessage(IfThen(IntToHex(i, 16) = hex, 'cheerio', 'rats'));
end;
Freundliche Grüße
  Mit Zitat antworten Zitat
ruedi

Registriert seit: 2. Jul 2007
6 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh

  Alt 2. Jul 2007, 10:42
Hallo Marabu...
Leider komme ich mit deiner letzten Antwort überhaupt nicht klar. Was meinst du mit cheerio bzw. rats? Wie hilft mir das weiter?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh

  Alt 2. Jul 2007, 10:55
Zitat:
Was meinst du mit cheerio bzw. rats? Wie hilft mir das weiter?
Sind nur Texte, welche ausgegeben werden, wenn Bedingung erfüllt (Cheerio) oder nicht erfüllt ("rats")
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh

  Alt 2. Jul 2007, 10:59
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
  Mit Zitat antworten Zitat
ruedi

Registriert seit: 2. Jul 2007
6 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh

  Alt 2. Jul 2007, 13:09
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh

  Alt 2. Jul 2007, 13:25
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
  Mit Zitat antworten Zitat
ruedi

Registriert seit: 2. Jul 2007
6 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Großer Hex-String in Dezimal String wandeln, rundungsfeh

  Alt 2. Jul 2007, 13:48
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???
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:32 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