PHP 给出与在线工具不同的十六进制值

PHP gives different hex value than an online tool

我正在通过 API 连接到 Steam,并从中获取 SteamID 以进行身份​​验证。

当我从 API 得到我的 user_id 时,它给我 76561198118533739,当我在 https://www.binaryhexconverter.com/decimal-to-hex-converter 上检查它时,正确的十六进制值是结果 (1100001096efa6b)。

但是,当我使用 PHP 函数 dechex 时,它给出了错误的值。我怎样才能得到正确的值来使用?

示例:

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

这个差异是因为您的 php 平台使用 32 位,但您测试的数字需要 64 位长 (http://php.net/manual/en/function.dechex.php) - 二进制在线计算器给出正确答案。您可以使用 echo PHP_INT_SIZE*8;

查看您有多少 "bit"

PHP这个函数没有报错,应该是整数溢出报错,可惜没有。7fffffff是最大的有符号32位整数,和这个差不多函数将在 32 位平台上运行。要在 32 位系统上将此数字正确转换为十六进制,请使用 bcmath 或 GMP 等任意精度库来计算十六进制值,这是 "joost at bingopaleis dot com"

在评论中发布的其中 1 个
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 位了?