Преобразование шестнадцатеричного 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 с именем "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;