PHPでは、 Bindec関数は、バイナリ文字列を10進値に変換するために使用される一般的な関数です。その基本的な使用法は非常に簡単です:
<?php
$binaryString = "1010";
$decimal = bindec($binaryString);
echo $decimal; // 出力 10
?>
ただし、 「0B1010」などの「0B」が付いたバイナリ数値文字列が表示される場合があります。それでは、 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は「b」文字で停止するため、エラー結果(通常0)を返します。
「0B」プレフィックスで文字列を解析する場合は、最初にプレフィックスを削除してからBindecを呼び出す必要があります。
このポイントを理解すると、「0B」プレフィックスを直接通過する文字列を渡すことができないため、多くの不要なエラーやデバッグ時間を回避できます。