Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert hex str to decimal value in delphi

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?

like image 577
Simon Mardiné Avatar asked Dec 12 '12 14:12

Simon Mardiné


4 Answers

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;
like image 142
Simon Mardiné Avatar answered Sep 27 '22 17:09

Simon Mardiné


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.

like image 39
whosrdaddy Avatar answered Oct 31 '22 08:10

whosrdaddy


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
like image 7
Andreas Rejbrand Avatar answered Oct 31 '22 07:10

Andreas Rejbrand


to work with big numbers you need external library for delphi

Large numbers in Pascal (Delphi)

like image 3
shibormot Avatar answered Oct 31 '22 08:10

shibormot