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



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

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

但是,当我使用 PHP 函数 dechex 时,它给了我错误的值。如何获取要使用的正确值?

例:

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

PHP 对这个函数没有错误报告,它应该给出整数溢出的错误,但没有这样的运气。 7ffffff是最大的有符号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 位了?

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

最新更新