2011-04-27 40 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倍。