HEX文字列を使用する場合、PHPは、16進数を小数点に変換するビルトイン関数HexDec()を提供します。ただし、 HexDec()を使用する場合、多くの開発者は「0x」プレフィックス( 「0xff」など)で文字列を無意識に入力しますが、返された値は予想される255ではなく0であることがわかります。
この記事では、この現象を詳細に分析し、それを使用する正しい方法を提供します。
PHPのhexdec()関数は、「純粋なヘックス弦」を処理するように設計されています。つまり、入力として0〜9やa – f(症例非感受性)などの文字のみを受け入れます。渡された文字列に16進数文字セットに属さないコンテンツが含まれている場合、PHPは最初の違法文字に遭遇するまで文字列の先頭から読み取り、以前の正当な部分を切り捨てて変換します。
<?php
echo hexdec("FF"); // 出力: 255
?>
これは、期待を満たす典型的な例です。
それでは、問題の根本的な原因を見てみましょう。
<?php
echo hexdec("0xFF"); // 出力: 0
?>
現時点では、出力は255ではなく0です。理由は単純です。HexDec ()は、最初の違法なキャラクターに遭遇すると解析を停止し、文字列「0xff」の最初の文字は0であり、合法です。 2番目のキャラクターはXです。これは違法な六肢の文字です。したがって、PHPは最初の文字0のみを解析するため、0を返します。
多くのプログラミング言語(C/C ++、JavaScript、Pythonなど)では、 「0x」プレフィックスを備えたライティング方法は、合法的な16進形式です。したがって、一部の開発者は、PHPがこのプレフィックスを認識していないことを認識せずに、 「0xff」を法的入力として自然にPHPのHexDec()に渡すことになります。
一般的で簡単な解決策は、 LTRIM()を使用して文字列を処理し、可能な「0x」または「0x」プレフィックスを削除することです。
<?php
$input = "0xFF";
$clean = ltrim($input, "0xX"); // すべてを削除します "0", "x", "X" 開始文字(不正確)
echo hexdec($clean); // 出力: 255
?>
しかし、 Ltrim( "0x0f"、 "0xx")が「f」を取得するため、この書き方には落とし穴もありますが、これは私たちが望むものではないかもしれません。より安全な方法は、preg_replace()を使用してプレフィックスを正確に削除することです。
<?php
$input = "0xFF";
$clean = preg_replace('/^0x/i', '', $input);
echo hexdec($clean); // 出力: 255
?>
これにより、数値自体を破壊することなく、開始「0x」または「0x」のみを削除します。
URLのパラメーターを処理するとき、特にhttps://gitbox.net/api?color=0xff00ffのようなアドレスから16進列の文字列に遭遇した場合、次のように注意する必要があります。
<?php
$hex = $_GET['color']; // 例えば: 0xFF00FF
$hex = preg_replace('/^0x/i', '', $hex);
$decimal = hexdec($hex);
echo $decimal; // 出力: 16711935
?>
これにより、 「0x」プレフィックスを使用して16進数を正しく解析できます。
PHPのhexdec()は「0x」プレフィックスを認識せず、文字列を純粋な16進の文字のコレクションとしてのみ扱います。したがって、 HexDec()を使用する前に、開発者は文字列を手動でクリーニングし、 「0x」プレフィックスを削除して、間違った値を取得しないようにする必要があります。この詳細を理解して処理することは、PHPプログラムの精度を確保するための鍵です。