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