PHP дает другое шестнадцатеричное значение, чем онлайн-инструмент - PullRequest
0 голосов
/ 25 октября 2018

Я подключаюсь через API к Steam и получаю от него SteamID для аутентификации.

Когда я получаю свой user_id от API, он дает мне 76561198118533739, и когда я проверяю его на https://www.binaryhexconverter.com/decimal-to-hex-converter,, правильное шестнадцатеричное значение является результатом (1100001096efa6b).

Но когда я использую функцию PHP dechex, это дает мне неправильное значение.Как я могу получить правильное значение для использования?

Пример:

<?php
echo dechex(76561198118533739); // 7fffffff
?>

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

PHP не имеет отчетов об ошибках для этой функции, он должен был выдать ошибку для целочисленного переполнения, но не повезло. 7fffffff - это наибольшее 32-разрядное целое число со знаком, которое настолько близко, насколько эта функция получится на 32-разрядных платформах.,чтобы правильно преобразовать это число в шестнадцатеричное в 32-битной системе, используйте произвольную библиотеку точности, такую ​​как bcmath или GMP, чтобы вычислить шестнадцатеричное значение, вот 1 из тех, что опубликованы в комментариях "joost at bingopaleis dot com"

function dec2hex($number)
{
    $hexvalues = array('0','1','2','3','4','5','6','7',
               '8','9','A','B','C','D','E','F');
    $hexval = '';
     while($number != '0')
     {
        $hexval = $hexvalues[bcmod($number,'16')].$hexval;
        $number = bcdiv($number,'16',0);
    }
    return $hexval;
}
  • для работы требуется расширение bcmath.

также имейте в виду, что число слишком велико, чтобы хранить его как число в 32-битных системах, поэтому вам нужно хранить его как строку.

dec2hex("76561198118533739"); // "1100001096efa6b"

, если bcmath равеннедоступно, может быть, пришло время обновить ваши серверы до 64 бит?

0 голосов
/ 25 октября 2018

Это различие заключается в том, что ваша php-платформа использует 32-битную, а числовое значение, которое вы тестируете, должно быть 64-битным (http://php.net/manual/en/function.dechex.php) - двоичный онлайн-калькулятор дает правильный ответ. Вы можете проверить, сколько "бит" вы используете, используя echo PHP_INT_SIZE*8;

...