在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"前綴的字符串,可以避免很多不必要的錯誤和調試時間。