使用PHP hexdec的大十六进制值

ala*_*and 11 php hex

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

$h = 'D5CE3E462533364B';
$f = hexdec($h);
echo $f .' = '. Exp_to_dec($f);
Run Code Online (Sandbox Code Playgroud)

输出:1.5406319846274E + 19 = 15406319846274000000

来自calc.exe = 15406319846273791563的结果

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

Pas*_*TIN 26

hexdec手册页所述:

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

如果你想获得某种大整数(不是浮点数),你需要将它存储在一个字符串中.使用BC Math函数可能会出现这种情况.

例如,如果您查看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;
}
Run Code Online (Sandbox Code Playgroud)

(此功能已从我链接的注释中复制;并且只有一点适合我)

并在你的号码上使用它:

$h = 'D5CE3E462533364B';
$f = bchexdec($h);
var_dump($f);
Run Code Online (Sandbox Code Playgroud)

输出将是:

string '15406319846273791563' (length=20)
Run Code Online (Sandbox Code Playgroud)

所以,不是那种大浮子; 对你期望的东西似乎没问题:

来自calc.exe = 15406319846273791563的结果


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


Ran*_*ndy 5

当结果太大而无法表示为 int 时,hexdec() 从 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
Run Code Online (Sandbox Code Playgroud)