我在使用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)
发生了什么事?
答案 0 :(得分:2)
在documentation中明确说过:
可以转换的最大数字是
PHP_INT_MAX * 2 + 1
(或 -1):在32位平台上,这将是十进制的4294967295
, 这会导致dechex()
返回ffffffff
。
相对清楚的是,您正在使用32位平台,因为bindec()在您的情况下产生了float
,而不是integer
:
该函数可以转换太大的数字以适应 平台整数类型,较大的值以float形式返回 情况下。
问题是,bindec
确实足够聪明'要进行此类转换,dechex
不会这样做 - 它仅适用于integer
值。