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