在 PHP 中,bindec 函数是用来将二进制字符串转换成十进制数值的常用函数。它的基本用法非常简单:
<?php
$binaryString = "1010";
$decimal = bindec($binaryString);
echo $decimal; // 输出 10
?>
然而,有时候我们会看到二进制数字字符串前面带有 "0b" 前缀,比如 "0b1010"。那么,bindec 函数遇到这种带有前缀的字符串时,会怎样处理呢?本文将围绕这一点做详细解析。
bindec 函数根据官方文档的说明,是解析字符串中从左到右的所有二进制位('0'或'1'),直到遇到第一个非二进制字符为止,然后将已读取的部分转换为十进制整数。
简而言之,bindec 只关注字符串中有效的二进制字符,其他字符会导致解析提前结束。
我们可以通过示例代码验证一下:
<?php
echo bindec("1010") . "\n"; // 输出 10
echo bindec("0b1010") . "\n"; // 输出 0
echo bindec("b1010") . "\n"; // 输出 0
echo bindec("01010") . "\n"; // 输出 10
?>
从结果可以看到:
"1010" 被正常解析为 10。
"0b1010" 返回 0,因为函数在解析时遇到了第一个字符 '0' 是合法二进制,接着字符 'b' 不是合法二进制数字,导致解析停止,只解析了 '0',即十进制的0。
"b1010" 直接返回0,因为第一个字符 'b' 就不是二进制数字,解析失败。
"01010" 是有效的二进制字符串,结果为10。
这表明,bindec 不支持带 "0b" 前缀的二进制字符串,它只会解析前缀中有效的二进制部分,遇到非二进制字符则终止解析。
如果你需要解析带有 "0b" 前缀的二进制字符串,可以先去除这个前缀,再调用 bindec。
示例代码:
<?php
function bindec_with_prefix(string $binaryStr): int {
// 如果字符串以 '0b' 或 '0B' 开头,去除前缀
if (stripos($binaryStr, '0b') === 0) {
$binaryStr = substr($binaryStr, 2);
}
return bindec($binaryStr);
}
echo bindec_with_prefix("0b1010"); // 输出 10
echo "\n";
echo bindec_with_prefix("1010"); // 输出 10
?>
这样处理后,无论字符串是否带 "0b" 前缀,都可以正确转换为十进制数。
PHP 中的 bindec 函数只接受纯二进制字符串(由 '0' 和 '1' 组成),遇到非二进制字符会停止解析。
二进制字符串前加 "0b" 前缀会导致 bindec 返回错误结果(一般为0),因为它会在 'b' 字符处停止。
如果要解析带有 "0b" 前缀的字符串,应先去除前缀,再调用 bindec。
了解了这一点,避免直接传入带 "0b" 前缀的字符串,可以避免很多不必要的错误和调试时间。