現在の位置: ホーム> 最新記事一覧> なぜHexDec( "0xff")が期待値を返さないのですか?

なぜHexDec( "0xff")が期待値を返さないのですか?

gitbox 2025-05-27

HEX文字列を使用する場合、PHPは、16進数を小数点に変換するビルトイン関数HexDec()を提供します。ただし、 HexDec()を使用する場合、多くの開発者は「0x」プレフィックス( 「0xff」など)で文字列を無意識に入力しますが、返された値は予想される255ではなく0であることがわかります。

この記事では、この現象を詳細に分析し、それを使用する正しい方法を提供します。

1。hexdec()の当初の意図

PHPのhexdec()関数は、「純粋なヘックス弦」を処理するように設計されています。つまり、入力として0〜9やa – f(症例非感受性)などの文字のみを受け入れます。渡された文字列に16進数文字セットに属さないコンテンツが含まれている場合、PHPは最初の違法文字に遭遇するまで文字列の先頭から読み取り、以前の正当な部分を切り捨てて変換します。

 <?php
echo hexdec("FF");   // 出力: 255
?>

これは、期待を満たす典型的な例です。

2。 「0xff」に遭遇するとどうなりますか?

それでは、問題の根本的な原因を見てみましょう。

 <?php
echo hexdec("0xFF");   // 出力: 0
?>

現時点では、出力は255ではなく0です。理由は単純です。HexDec ()は、最初の違法なキャラクターに遭遇すると解析を停止し、文字列「0xff」の最初の文字は0であり、合法です。 2番目のキャラクターはXです。これは違法な六肢の文字です。したがって、PHPは最初の文字0のみを解析するため、0を返します。

3。一般的な誤解: 「0xff」を標準的な16進表現として扱う

多くのプログラミング言語(C/C ++、JavaScript、Pythonなど)では、 「0x」プレフィックスを備えたライティング方法は、合法的な16進形式です。したがって、一部の開発者は、PHPがこのプレフィックスを認識していないことを認識せずに、 「0xff」を法的入力として自然にPHPのHexDec()に渡すことになります。

4.「0x」プレフィックスで文字列を正しく処理する方法は?

一般的で簡単な解決策は、 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」のみを削除します。

5。URLの16進パラメーターの場合

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プログラムの精度を確保するための鍵です。