2012-12-12 14 views
8

Delphi에서 정수 값의 16 진수 값을 문자열 표현으로 변환하는 데 문제가 있습니다.델파이에서 hex str을 10 진수 값으로 변환

Abs(StrToInt64('$FC75B6A9D025CB16')) 

하지만 난 윈도우에서 CALC 프로그램을 사용하는 경우, 결과는 다음과 같습니다 : 18,191,647,110290852630

전 기능을 사용할 때

$ FC75B6A9D025CB16 나에게 802,829,546을 제공 : 예를 들어

제 질문은 : 그렇습니다. 나, 또는 계산?

아무도 이미 이런 종류의 문제가 있습니까?

+2

그건 그렇고, 802829546이 옳지 않다는 것은 꽤 분명합니다. 정수의 십진수 표현은 16 진수 표현보다 소수 일 수 없습니다. –

+0

어떤 델파이 버전을 사용하고 있습니까? 델파이 XE에서 나는 예상 결과 인 코드를 사용하여 255096963418698986을 얻습니다. – whosrdaddy

+0

FC로 시작하는 @Andreas는 음수 일 수 있고, 다음은 더 짧을 수 있습니다 :-) –

답변

2

Delphi6에서 작업하고이 버전에는 Uint64 유형이 없으므로 "DFF 라이브러리"라는 Delphi 라이브러리를 사용해야했습니다.
Main page

여기 진수 값의 문자열로 16 진수 값의 문자열을 변환 내 코드입니다 :

당신은 당신의 장치에 사용에 UBigIntsV3를 추가해야합니다.

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

숫자가 너무 커서 부호가있는 64 비트 숫자로 표시 할 수 없습니다.

FC75B6A9D025CB16h = 18191647110290852630d 

가장 큰 가능한 서명 64 비트 값은 802829546 여기에 분명히 잘못

2^63 - 1 = 9223372036854775807 
10

에 대한 외부 라이브러리를 필요로 큰 숫자와 함께 작업하는 것입니다 .

Calc는 64 비트 부호없는 값 (18191647110290852630d)을 반환합니다.

델파이 INT64 유형은 표시로 가장 높은 비트를 사용

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

반환 후 Arnaud's answer here 체크 아웃, 당신은 서명 64 비트보다 큰 값으로 작업해야하는 경우

올바른 -255096963418698986 가치.

관련 문제