2011-04-27 47 views
4
pack('H*', dechex(12345678900)) /* on 32bit */ 
!= pack('H*', dechex(12345678900)) /* on 64bit */ 

爲什麼壞了?PHP5包上x84_64 ENV

+0

哪個版本的php5?在一些早期的PHP版本中有一個包錯誤(希望我能找到它的參考) – 2011-04-27 05:04:37

+0

我們使用PHP 5.2.5 – freddiefujiwara 2011-04-27 05:10:27

+0

你可以嘗試5.3和\或提交一個錯誤報告 – 2011-04-27 07:30:34

回答

1

我不知道如何解決它,但我想我知道爲什麼會發生這種情況。這裏沒有錯誤 - 從手動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倍。