pack('H*', dechex(12345678900)) /* on 32bit */ != pack('H*', dechex(12345678900)) /* on 64bit */
为什么坏了?PHP5包上x84_64 ENV
pack('H*', dechex(12345678900)) /* on 32bit */ != pack('H*', dechex(12345678900)) /* on 64bit */
为什么坏了?PHP5包上x84_64 ENV
我不知道如何解决它,但我想我知道为什么会发生这种情况。这里没有错误 - 从手动http://php.net/manual/en/function.dechex.php
straigt出可转换的最大数值为4294967295十进制从而为“FFFFFFFF”
我不知道究竟发生了“内部” PHP ,但是你可能会导致32位无符号整数溢出(12,345,678,900> 4,294,967,295)。由于在64位这个限制应该是18,446,744,073,709,551,615,dechex返回“正确的”值(32对64位差异似乎没有记录,我可能是错误的,因为我没有64位系统进行测试)。
//编辑:
正如你可以使用GMP extesion使自己hecdex功能的32位系统的最后手段,但会产生很多很多的开销。可能会成为现代编程中已知最慢的实现之一。
// EDIT2:
此刻写使用BCMath一个功能,我在Windows,挣扎着寻找正确的DLL的GMP。
function dechex32($i) {
//Cast string
$i = (string)$i;
//Initialize result string
$r = NULL;
//Map hex values 0-9, a-f to array keys
$hex = array_merge(range(0, 9), range('a', 'f'));
//While input is lagrer than 0
while(bccomp($i, '0') > 0) {
//Modulo 16 and append hex char to result
$r.= $hex[$mod = bcmod($i, '16')];
//i = (i - mod)/16
$i = bcdiv(bcsub($i, $mod), '16');
}
//Reverse result and return
return strrev($r);
}
var_dump(dechex32(12345678900));
/*string(9) "2dfdc1c34"*/
没有完全测试,但似乎工作。作为最后的手段 - 使用100,000次迭代进行粗略的基准测试表明,它比本机实现速度慢大约40倍。
哪个版本的php5?在一些早期的PHP版本中有一个包错误(希望我能找到它的参考) – 2011-04-27 05:04:37
我们使用PHP 5.2.5 – freddiefujiwara 2011-04-27 05:10:27
你可以尝试5.3和\或提交一个错误报告 – 2011-04-27 07:30:34