PHPでは、 bindec()関数を使用して、バイナリ数(文字列として表される)を小数点に変換します。ただし、実際に使用すると、機能が予想どおりに機能しない原因となるエラーや問題が発生する場合があります。これらの一般的なエラーと処理のヒントを理解することで、これらの問題を回避または解決し、コードが適切に機能することを確認するのに役立ちます。
bindec()関数の基本的な構文は次のとおりです。
<span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">bindec</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$binary_string</span></span><span>);
</span></span>
$ binary_string :これは、バイナリ番号を含む文字列です(文字 '0'と '1'のみで構成されています)。
戻り値は小数整数です。
例えば:
<span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">bindec</span></span><span>(</span><span><span class="hljs-string">'1101'</span></span><span>); </span><span><span class="hljs-comment">// 出力:13</span></span><span>
</span></span>
bindec()は、 0と1で構成される文字列のみを受け入れます。文字列に他の文字(スペース、文字、記号など)が含まれている場合、エラーまたは0が返されます。
<span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">bindec</span></span><span>(</span><span><span class="hljs-string">'110a'</span></span><span>); </span><span><span class="hljs-comment">// 出力:0</span></span><span>
</span></span>
渡された文字列にバイナリ番号のみが含まれていることを確認してください。入力の有効性がわからない場合は、 preg_match()を使用して文字列形式を確認できます。
<span><span><span class="hljs-variable">$binary_string</span></span><span> = </span><span><span class="hljs-string">'110a'</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">preg_match</span></span><span>(</span><span><span class="hljs-string">'/^[01]+$/'</span></span><span>, </span><span><span class="hljs-variable">$binary_string</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">bindec</span></span><span>(</span><span><span class="hljs-variable">$binary_string</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"無効なバイナリ文字列"</span></span><span>;
}
</span></span>
bindec()に渡された文字列が空の場合、返品値は0になります。これは間違いではありませんが、期待する動作ではないかもしれません。
<span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">bindec</span></span><span>(</span><span><span class="hljs-string">''</span></span><span>); </span><span><span class="hljs-comment">// 出力:0</span></span><span>
</span></span>
bindec()を呼び出す前に、文字列が空であるかどうかを確認します。空の場合、デフォルト値を指定するか、エラーメッセージをトリガーできます。
<span><span><span class="hljs-variable">$binary_string</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-keyword">empty</span></span><span>(</span><span><span class="hljs-variable">$binary_string</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"入力文字列は空にすることはできません"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">bindec</span></span><span>(</span><span><span class="hljs-variable">$binary_string</span></span><span>);
}
</span></span>
Bindec()は、バイナリ文字列の主要なゼロを自動的に無視します。通常、これは変換に影響しませんが、先行ゼロを正確に処理する場合は、事前にゼロを削除できます。
<span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">bindec</span></span><span>(</span><span><span class="hljs-string">'0000101'</span></span><span>); </span><span><span class="hljs-comment">// 出力:5</span></span><span>
</span></span>
主要なゼロを削除するか、デバッグや処理のためにそれらを残すことを選択できます。
<span><span><span class="hljs-variable">$binary_string</span></span><span> = </span><span><span class="hljs-string">'0000101'</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">bindec</span></span><span>(</span><span><span class="hljs-title function_ invoke__">ltrim</span></span><span>(</span><span><span class="hljs-variable">$binary_string</span></span><span>, </span><span><span class="hljs-string">'0'</span></span><span>)); </span><span><span class="hljs-comment">// 出力:5</span></span><span>
</span></span>
バイナリ文字列が非常に多数を表す場合、 bindec()を正しく処理できない場合があります。 PHPの整数タイプは最も一般的な値をサポートしていますが、プラットフォームの範囲外の値に対してオーバーフローまたはエラーが発生する場合があります。
<span><span><span class="hljs-variable">$large_binary</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_repeat</span></span><span>(</span><span><span class="hljs-string">'1'</span></span><span>, </span><span><span class="hljs-number">65</span></span><span>); </span><span><span class="hljs-comment">// 超える 64 少し</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">bindec</span></span><span>(</span><span><span class="hljs-variable">$large_binary</span></span><span>); </span><span><span class="hljs-comment">// オーバーフローを引き起こす可能性があります</span></span><span>
</span></span>
Super-Largeバイナリ文字列の場合、任意の精度数値処理をサポートするgmp_init()およびgmp_strval()関数を使用することを検討できます。
<span><span><span class="hljs-variable">$large_binary</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_repeat</span></span><span>(</span><span><span class="hljs-string">'1'</span></span><span>, </span><span><span class="hljs-number">65</span></span><span>);
</span><span><span class="hljs-variable">$gmp_value</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gmp_init</span></span><span>(</span><span><span class="hljs-variable">$large_binary</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">gmp_strval</span></span><span>(</span><span><span class="hljs-variable">$gmp_value</span></span><span>); </span><span><span class="hljs-comment">// 多数を正しく変換します</span></span><span>
</span></span>
bindec()関数は、バイナリ表現(補数形など)での負の数の処理をサポートしません。負の数に対処する必要がある場合は、通常、手動で変換する必要があります。
<span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">bindec</span></span><span>(</span><span><span class="hljs-string">'-1101'</span></span><span>); </span><span><span class="hljs-comment">// 出力:0,否定的な兆候の認識はありません</span></span><span>
</span></span>
ネガティブサインを手動で識別し、変換します。
<span><span><span class="hljs-variable">$binary_string</span></span><span> = </span><span><span class="hljs-string">'-1101'</span></span><span>;
</span><span><span class="hljs-variable">$is_negative</span></span><span> = </span><span><span class="hljs-variable">$binary_string</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>] == </span><span><span class="hljs-string">'-'</span></span><span>;
</span><span><span class="hljs-variable">$binary_string</span></span><span> = </span><span><span class="hljs-title function_ invoke__">ltrim</span></span><span>(</span><span><span class="hljs-variable">$binary_string</span></span><span>, </span><span><span class="hljs-string">'-'</span></span><span>);
</span><span><span class="hljs-variable">$decimal</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bindec</span></span><span>(</span><span><span class="hljs-variable">$binary_string</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$is_negative</span></span><span>) {
</span><span><span class="hljs-variable">$decimal</span></span><span> = -</span><span><span class="hljs-variable">$decimal</span></span><span>;
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$decimal</span></span><span>; </span><span><span class="hljs-comment">// 出力:-13</span></span><span>
</span></span>
Bindec()関数はPHPで非常に便利なツールですが、いくつかの共通の制限と潜在的な問題もあります。入力文字列の有効性、主要なゼロ、および大きな値の処理を確保することにより、最も一般的な間違いを回避できます。負の数と特別な形式のバイナリ文字列の場合、手動で処理する必要がある場合があります。これらの手法を習得すると、PHPのbindec()機能をより効率的に使用するのに役立ちます。