Преобразование шестнадцатеричного str в десятичное значение в delphi

У меня проблема с преобразованием строкового представления шестнадцатеричного значения в целочисленное значение с Delphi.

например:

$FC75B6A9D025CB16 дайте мне 802829546, когда я использую функцию:

Abs(StrToInt64('$FC75B6A9D025CB16'))

но если я использую программу calc из Windows, результат: 18191647110290852630

Итак, мой вопрос: кто прав? я или Калк?

у кого-нибудь уже были такие проблемы?

4 ответов


в самом деле 802829546 здесь явно не так.

Calc возвращает 64-битное значение без знака (18191647110290852630d).

тип Delphi Int64 использует самый высокий бит как знак:

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

возвращает значение -255096963418698986 это правильно

Если вам нужно работать со значениями, превышающими 64bit, то проверьте ответ Арно здесь.


число слишком велико, чтобы его можно было представить в виде 64-разрядного числа со знаком.

FC75B6A9D025CB16h = 18191647110290852630d

максимально возможное 64-разрядное значение со знаком

2^63 - 1 = 9223372036854775807

для работы с большими числами вам нужна внешняя библиотека для delphi

большие числа в Pascal (Delphi)


мне пришлось использовать библиотеку Delphi с именем "DFF Library", потому что я работаю над Delphi6 и типом Uint64 не существует в этой версии.
Главная страница

вот мой код для преобразования строки шестнадцатеричного значения в строку десятичного значения:

вам нужно добавить 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;