2012-12-12 16 views
8

Ich habe ein Problem, eine Zeichenfolge Darstellung eines Hexadezimalwerts in Integer-Wert mit Delphi zu konvertieren.Konvertiere Hexadezimalzahl in Delphi in den Dezimalwert

zum Beispiel:

$ FC75B6A9D025CB16 geben Sie mir 802.829.546, wenn ich die Funktion verwenden:

Abs(StrToInt64('$FC75B6A9D025CB16')) 

, aber wenn ich die Calc-Programm von Windows verwenden, ist das Ergebnis: 18191647110290852630

Also meine Frage ist: Wer hat Recht? ich oder der Kalk?

Hat schon jemand diese Art von Problem?

+2

Übrigens ist es ziemlich offensichtlich, dass 802829546 nicht richtig sein kann. Die dezimale Darstellung einer ganzen Zahl darf nicht weniger Ziffern als die hexadezimale Darstellung haben. –

+0

Welche Delphi-Version verwenden Sie? In Delphi XE bekomme ich 255096963418698986 mit Ihrem Code, der das erwartete Ergebnis ist ... – whosrdaddy

+0

@Andreas beginnend mit FC - es könnte negative Zahl sein, dann kann es kürzer sein :-) –

Antwort

2

Ich musste eine Delphi-Bibliothek namens "DFF-Bibliothek" verwenden, da ich an Delphi6 arbeite und der Typ Uint64 in dieser Version nicht existiert.
Main page

Hier ist mein Code eine Reihe von hexadezimalen Wert in einen String von Dezimalwert zu transformieren:

Sie müssen UBigIntsV3 auf Ihre Anwendungen in Ihrem Gerät hinzuzufügen.

function StrHexaToUInt64Str(const stringHexadecimal: String): string; 
var 
    unBigInteger:TInteger; 
begin 
    unBigInteger:=TInteger.Create; 
    try 
    // stringHexadecimal parameter is passed without the '$' symbol 
    // ex: stringHexadecimal:='FFAA0256' and not '$FFAA0256' 
    unBigInteger.AssignHex(stringHexadecimal); 
    //the boolean value determine if we want to add the thousand separator or not. 
    Result:=unBigInteger.converttoDecimalString(false); 
    finally 
    unBigInteger.free; 
    end; 
end; 
7

Die Nummer ist zu groß, um als 64-Bit-Zahl mit Vorzeichen dargestellt zu werden.

FC75B6A9D025CB16h = 18191647110290852630d 

Der größtmögliche signierte 64-Bit-Wert ist

2^63 - 1 = 9223372036854775807 
10

In der Tat 802829546 ist eindeutig falsch .

Calc gibt einen vorzeichenlosen 64-Bit-Wert zurück (18191647110290852630d).

Delphi Int64 Typ verwendet höchste Bit als Zeichen:

Int := StrToInt64('$FC75B6A9D025CB16'); 
Showmessage(IntToStr(Int)); 

kehrt -255096963418698986 Wert, der

korrekt ist, wenn Sie mit Werten größer als 64-Bit arbeiten müssen unterzeichnet, dann Arnaud's answer here überprüfen.