Intereting Posts
Предотвращение отправки формы, если динамическое поле пуст … Php / Jquery / Ajax Два запроса mysql в одном объекте json Определение переменных вне класса PHP Создание таблицы SQLite только в том случае, если она еще не существует Определение типа файла с помощью PHP. Что такое Magic Database? cURL неправильно загружает изображения POST-переменная из jquery-перенаправления, но не задана mail (): ответ SMTP-сервера: 550 Недопустимый адрес на hmailserver Как запустить Django и PHP на одном сервере Apache? Скопировать все файлы и папки из одного каталога в другой каталог PHP Как передать массив в качестве нескольких параметров для работы? Как я могу получить контент между?> И <? Php как автоматически копировать весь каталог в виде эскизов, используя phpthumb (или некоторую другую библиотеку) Подключение к защищенной веб-службе WS-Security с помощью PHP Как получить текущий идентификатор категории – OpenCart 2.0

Как преобразовать шестнадцатеричное значение в целое число со знаком в PHP?

Я пытаюсь преобразовать шестнадцатеричную строку в целое число со знаком.

Я могу легко перенести его в значение без знака с помощью 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 иногда представляют собой настоящую золотую жилу 😉