【发布时间】:2018-03-15 04:02:26
【问题描述】:
我需要在 PHP 中将十六进制字符串转换为 int64,它应该使用最后一位作为符号,而不是达到最大值。例如:
$hex = "eb3dd796efda2409"
我需要最终结果是
-1495802457948019703
我通过将十六进制转换为 uint64 并返回到 int64,在其他语言(python / go)上实现了这个结果。我知道 PHP 不能明确地执行 unsigned int64。
我发现这个函数使用 bcmath 正确地将十六进制转换为 uint64 字符串
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;
}
但我无法将 uint64 的字符串转换为 int64。它只会打印最大尺寸而不是下降到负值。知道怎么做吗?
【问题讨论】:
-
您必须先检查符号位(最高有效位)。如果数字是正数,请使用上面的函数进行转换。如果为负数,则执行2's complement conversion,即反转数字(按位),计算其值,然后加 1。