PHP:为什么即使数量很少,dechex也会失败?

时间:2014-09-12 06:47:31

标签: php binary hex

我在使用bindec和dechex函数将二进制字符串转换为十六进制字符串时遇到问题。在我的研究中,我发现PHP一般或者dechex特别是整数大小限制为319259235818.但是,即使我的应用程序中的最大可能整数小一个数量级,我的代码也会失败

$bin = "11111111111111111111111111111111111";
var_dump($bin); //'11111111111111111111111111111111111' (length=35)

$dec = bindec($bin);
var_dump($dec); // float 34359738367

$hex = dechex($dec);
var_dump($hex); // 'ffffffff' (length=8) (binaryhexconverter.com shows 7FFFFFFFF (length 9) as the result)

$dec2 = hexdec($hex);
var_dump($dec2); //float 4294967295

$bin2 = decbin(hexdec($hex));
var_dump($bin2); //'11111111111111111111111111111111' (length=32)

发生了什么事?

1 个答案:

答案 0 :(得分:2)

documentation中明确说过:

  

可以转换的最大数字是PHP_INT_MAX * 2 + 1(或   -1):在32位平台上,这将是十进制的4294967295,   这会导致dechex()返回ffffffff

相对清楚的是,您正在使用32位平台,因为bindec()在您的情况下产生了float,而不是integer

  

该函数可以转换太大的数字以适应   平台整数类型,较大的值以float形式返回   情况下。

问题是,bindec确实足够聪明'要进行此类转换,dechex不会这样做 - 它仅适用于integer值。