Php 在32位系统上将64位整数十六进制字符串转换为64位十进制字符串

Php 在32位系统上将64位整数十六进制字符串转换为64位十进制字符串,php,Php,在32位系统上,将编码为十六进制字符串的64位整数转换为十进制字符串的简单方法是什么。它必须是完整值,不能用科学符号表示或截断:/ “0C800000000063”=“900719925474099999” “0C8000000000063”!=9.007199254741E+17 PHP的base_convert()和hexdec()做得不好。您看到PHP.net上hexdec帮助页面的第一条评论了吗 当给定大数字时,hexdec函数会自动转换 科学符号的价值。因此,“aa1233123124

在32位系统上,将编码为十六进制字符串的64位整数转换为十进制字符串的简单方法是什么。它必须是完整值,不能用科学符号表示或截断:/

“0C800000000063”=“900719925474099999”

“0C8000000000063”!=9.007199254741E+17


PHP的base_convert()和hexdec()做得不好。

您看到PHP.net上hexdec帮助页面的第一条评论了吗

当给定大数字时,hexdec函数会自动转换 科学符号的价值。因此,“aa1233123124121241”作为 十六进制值将转换为“3.13725790445E+21”。如果你是 转换表示哈希值的十六进制值(md5或 sha),那么您需要该表示的每一点来实现它 有用。通过使用number_format函数,您可以做到这一点 完美地例如:


您需要使用PHP扩展(捆绑)

首先拆分输入字符串以获得高字节和低字节,然后将其转换为十进制,然后通过BC函数进行计算,如下所示:

$input = "0C80000000000063";

$str_high = substr($input, 0, 8);
$str_low = substr($input, 8, 8);

$dec_high = hexdec($str_high);
$dec_low  = hexdec($str_low);

//workaround for argument 0x100000000
$temp = bcmul ($dec_high, 0xffffffff);
$temp2 = bcadd ($temp, $dec_high);

$result = bcadd ($temp2, $dec_low);

echo $result;

/*
900719925474099299
*/

那不行。它只是扩展了它。0C8000000000062!=900719925474099328这是错误的,数字格式将使用四舍五入的数字。0x1234567890abcdef1234567890abcdef==24197857020151252728969465429440056815(基数10)
$input = "0C80000000000063";

$str_high = substr($input, 0, 8);
$str_low = substr($input, 8, 8);

$dec_high = hexdec($str_high);
$dec_low  = hexdec($str_low);

//workaround for argument 0x100000000
$temp = bcmul ($dec_high, 0xffffffff);
$temp2 = bcadd ($temp, $dec_high);

$result = bcadd ($temp2, $dec_low);

echo $result;

/*
900719925474099299
*/