【问题标题】:PHP gives different hex value than an online toolPHP 提供的十六进制值与在线工具不同
【发布时间】:2018-10-25 17:37:33
【问题描述】:

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

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

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

例子:

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

【问题讨论】:

    标签: php steam


    【解决方案1】:

    PHP 没有这个函数的错误报告,它应该给出一个整数溢出的错误,但没有这样的运气.. 7fffffff 是最大的有符号 32 位整数,它与这个函数在 32 位平台上的接近程度一样接近.要在 32 位系统上将此数字正确转换为十六进制,请使用 bcmath 或 GMP 等任意精度库来计算十六进制值,这是由“joost at bingopaleis dot com”发布在 cmets 中的 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 位了?

    【讨论】:

    • 感谢@hanshenrik - 作为一个魅力! :)
    【解决方案2】:

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

    【讨论】:

    • 是否有内置的PHP函数可以获得与在线工具相同的答案?
    • 我不知道,但是您可以使用 echo PHP_INT_SIZE; (4=32bit, 8=64bit) 查看您有多少“位”
    • 结果是4
    • 试试echo PHP_INT_SIZE*8;
    • @hanshenrik 我用你的好主意更新了我的答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2011-03-04
    • 1970-01-01
    • 2018-07-26
    • 2023-03-30
    • 2019-12-05
    相关资源
    最近更新 更多