具有 PHP 十六进制的大十六进制值

2022-08-31 00:10:11

我有一些大的十六进制值,我想显示为常规数字,我使用hexdec()转换为浮点型,我在 PHP.net 上发现了一个函数,可以将其转换为十进制,但它似乎达到了上限,例如:

$h = 'D5CE3E462533364B';
$f = hexdec($h);
echo $f .' = '. Exp_to_dec($f);

输出:1.5406319846274E+19 = 15406319846274000000

计算结果.exe = 15406319846273791563

有没有另一种方法来转换大的十六进制值?


答案 1

正如十六进制手册页上所说:

该函数现在可以将平台整数类型的值转换为大值,在这种情况下,它将以浮点数的形式返回值。

如果要获取某种大整数(不是浮点数),则需要将其存储在字符串中。使用BC数学函数,这可能是可能的。

例如,如果您查看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)

所以,不是你的那种大浮子;并且似乎可以满足您的期望:

计算结果.exe = 15406319846273791563


希望这个帮助;-)
而且,是的,PHP文档上的用户注释有时是一个真正的金矿;-)


答案 2

hexdec() 在结果太大而无法表示为 int 时从 int 切换到 float。如果您想要任意长的值,则可能必须滚动自己的转换函数以将十六进制字符串更改为GMP整数

function gmp_hexdec($n) {
  $gmp = gmp_init(0);
  $mult = gmp_init(1);
  for ($i=strlen($n)-1;$i>=0;$i--,$mult=gmp_mul($mult, 16)) {
    $gmp = gmp_add($gmp, gmp_mul($mult, hexdec($n[$i])));
  }
  return $gmp;
}

print gmp_strval(gmp_hexdec("D5CE3E462533364B"));

Output: 15406319846273791563

推荐