Я пытаюсь преобразовать шестнадцатеричную строку в целое число со знаком.
Я могу легко перенести его в значение без знака с помощью hexdec (), но это не дает знакового значения.
Редактировать:
код в VB – два символа «AA» являются репрезентативными.
Dim bs(2) As Byte bs(1) = "AA" bs(2) = "AA" Dim s As Short s = BitConverter.ToInt16(bs, 1)
Просмотрите этот комментарий через php.net:
hexdec () возвращает целые числа без знака. Например, hexdec («FFFFFFFE») возвращает 4294967294, а не -2. Чтобы преобразовать в подписанное 32-битное целое число, вы можете:
<?php echo reset(unpack("l", pack("l", hexdec("FFFFFFFE")))); ?>
Как сказано на странице руководства hexdec :
Теперь функция может преобразовывать значения, которые являются большими для целочисленного типа платформ, в этом случае вместо этого будет возвращено значение как float.
Если вы хотите получить какое-то большое целое число (не плавать), вам понадобится его хранить внутри строки … Это может быть возможно с использованием функций BC Math .
Например, если вы посмотрите в комментариях на странице руководства hexdec, вы найдете эту заметку
Если вы немного адаптируете эту функцию, чтобы избежать уведомления, вы получите:
function bchexdec($hex) { $dec = 0; $len = strlen($hex); for ($i = 1; $i <= $len; $i++) { $dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i)))); } return $dec; }
(Эта функция копируется из примечания, к которой я привязан, и только немного адаптирована мной)
И используя его на вашем номере:
$h = 'D5CE3E462533364B'; $f = bchexdec($h); var_dump($f);
Выход будет:
string '15406319846273791563' (length=20)
Итак, не такой большой поплавок, который у вас был; и, кажется, все в порядке с тем, что вы ожидаете:
Результат от calc.exe = 15406319846273791563
Надеюсь эта помощь 😉
И, да, примечания пользователя по документации PHP иногда представляют собой настоящую золотую жилу 😉