我有一些大的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
该函数现在可以转换为平台整数类型的大值,在这种情况下它将返回值为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文档的用户注释有时是真正的金矿;-)
当结果太大而无法表示为 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)
| 归档时间: |
|
| 查看次数: |
12239 次 |
| 最近记录: |