11

I've got a problem to convert a string representation of an hex value in integer value with Delphi.

for example:

$FC75B6A9D025CB16 give me 802829546 when i use the function:

Abs(StrToInt64('$FC75B6A9D025CB16')) 

but if i use the calc program from Windows, the result is: 18191647110290852630

So my question is: who's right? me, or the calc?

Does anybody already have this kind of problem?

8
  • 3
    By the way, it's pretty obvious that 802829546 cannot be right. The decimal representation of an integer cannot be of fewer digits than the hexadecimal representation. Commented Dec 12, 2012 at 14:46
  • what delphi version are you using? In Delphi XE I get 255096963418698986 using your code which is the expected result... Commented Dec 12, 2012 at 14:50
  • @Andreas starting with FC - it might be negative number, then it can be shorter :-) Commented Dec 12, 2012 at 14:59
  • You need to convert to UInt64, an unsigned value. See Arnaud's answer here: stackoverflow.com/questions/11808825/… Commented Dec 12, 2012 at 15:12
  • 5
    802829546 is the result when truncated to 32 bits. Did you store the result in an Integer or a Cardinal prior to displaying it? Commented Dec 12, 2012 at 18:08

4 Answers 4

12

In fact 802829546 is clearly wrong here.

Calc returns a 64bit unsigned value (18191647110290852630d).

Delphi Int64 type uses highest bit as sign:

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

returns value -255096963418698986 which is correct

If you need to work with values larger than 64bit signed, then check out Arnaud's answer here.

Sign up to request clarification or add additional context in comments.

Comments

9

The number is too big to be represented as a signed 64-bit number.

FC75B6A9D025CB16h = 18191647110290852630d 

The largest possible signed 64-bit value is

2^63 - 1 = 9223372036854775807 

Comments

3

to work with big numbers you need external library for delphi

Large numbers in Pascal (Delphi)

Comments

3

I had to use a Delphi library named "DFF Library" because I work on Delphi6 and the type Uint64 does not exist in this version.
Main page

Here's my code to transform a string of hexadecimal value to a string of decimal value:

You need to add UBigIntsV3 to your uses in your unit.

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; 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.