2012-12-12 6 views
8

Mam problem z konwersją reprezentacji łańcuchowej wartości szesnastkowej w wartości całkowitej z Delphi.Konwertuj szesnastkową str na wartość dziesiętną w delphi

na przykład:

$ FC75B6A9D025CB16 dać mi 802829546 podczas korzystania z funkcji:

Abs(StrToInt64('$FC75B6A9D025CB16')) 

ale jeśli mogę użyć programu Calc z Windows, wynik brzmi: 18191647110290852630

Moje pytanie brzmi: kto ma rację? ja, czy calc?

Czy ktoś ma już tego rodzaju problem?

+2

Przy okazji, jest całkiem oczywiste, że 802829546 nie może mieć racji. Dziesiętna reprezentacja liczby całkowitej nie może być mniejsza niż cyfra szesnastkowa. –

+0

jakiej wersji delphi używasz? W Delphi XE otrzymuję 255096963418698986 używając twojego kodu, który jest oczekiwanym rezultatem ... – whosrdaddy

+0

@Andreas zaczynając od FC - może to być liczba ujemna, wtedy może być krótszy :-) –

Odpowiedz

2

Musiałem użyć biblioteki Delphi o nazwie "Biblioteka DFF", ponieważ pracuję nad Delphi6, a typ Uint64 nie istnieje w tej wersji.
Main page

Oto mój kod, aby przekształcić ciąg wartości szesnastkowej do łańcucha wartości dziesiętnych:

Trzeba dodać UBigIntsV3 do zastosowań w swojej jednostce.

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

Liczba jest zbyt duża, aby mogła być reprezentowana jako podpisany 64-bitowy numer.

FC75B6A9D025CB16h = 18191647110290852630d 

Największy możliwy podpisał 64-bitowa wartość jest

2^63 - 1 = 9223372036854775807 
10

W rzeczywistości 802829546 jest wyraźnie źle tutaj .

Calc zwraca 64-bitową wartość bez znaku (18191647110290852630d).

typ Int64 Delphi wykorzystuje najwyższej trochę jak znak:

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

zwraca wartość, która jest poprawna -255096963418698986

Jeśli trzeba pracować z wartościami większymi niż 64bit podpisany, a następnie sprawdzić Arnaud's answer here.

Powiązane problemy