【PHP8.x】hex2bin関数の使い方

作成日: 更新日:

hex2bin関数は、16進数で表現された文字列を、元のバイナリデータに変換する処理を実行する関数です。この関数は、引数として受け取った16進数文字列を2文字ずつ解釈し、それぞれに対応する1バイトのバイナリデータに変換します。変換に成功した場合、結果として得られたバイナリデータを文字列として返します。しかし、入力文字列の文字数が奇数であったり、16進数として不正な文字(0-9、a-f、A-F以外)が含まれていたりすると、変換は失敗し、falseを返します。なお、入力文字列に含まれる空白文字(スペース、タブ、改行など)は、変換処理の前に無視されるため、整形された16進数文字列もそのまま扱うことが可能です。この関数は、バイナリデータを16進数文字列に変換するbin2hex()関数と対になるもので、エンコードされたデータを元に戻すといった用途で広く利用されます。例えば、"48656c6c6f20576f726c64" という文字列を渡すと、"Hello World" という結果が得られます。

基本的な使い方

構文(syntax)

<?php

// 16進数で表現された文字列
$hex_string = "48656c6c6f20576f726c64";

// 16進数文字列をバイナリデータ(通常の文字列)に変換する
$binary_data = hex2bin($hex_string);

// 変換後のバイナリデータを出力する
// 出力結果: string(11) "Hello World"
var_dump($binary_data);

?>

引数(parameters)

string $string

  • string $string: 16進数表現された文字列

戻り値(return)

string|false

16進数形式の文字列をバイナリ形式の文字列に変換した結果、または変換に失敗した場合はfalseを返します。

サンプルコード

PHP hex2bin オンラインコンバーター

<?php
declare(strict_types=1);

/**
 * このスクリプトは、Webフォーム経由で送信された16進数文字列を
 * PHPの `hex2bin` 関数を使用して通常の文字列に変換するオンラインツールです。
 *
 * 使い方:
 * 1. このファイルをWebサーバーのドキュメントルートに配置します。
 * 2. Webブラウザでこのファイルにアクセスします。
 * 3. フォームに16進数文字列を入力して「変換」ボタンを押します。
 *
 * 例:
 * 入力: 706870206865783262696e206f6e6c696e65
 * 出力: php hex2bin online
 */

// 出力する結果、エラーメッセージ、およびユーザーの入力値を初期化
$convertedString = '';
$errorMessage = '';
$inputHex = '';

// HTTPリクエストがPOSTメソッドの場合のみ処理を実行
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // POSTされた16進数文字列を取得
    $inputHex = $_POST['hex_string'] ?? '';

    // 入力文字列の前後の空白を削除
    $trimmedHex = trim($inputHex);

    if ($trimmedHex !== '') {
        // hex2bin()は不正な入力(奇数長の文字列、16進数以外の文字)で警告を発生させます。
        // @演算子で警告を抑制し、戻り値がfalseかどうかで成否を判断するのが一般的です。
        $binaryData = @hex2bin($trimmedHex);

        if ($binaryData === false) {
            // 変換に失敗した場合
            $errorMessage = '無効な16進数文字列です。文字列の長さが偶数であること、0-9とa-fの文字のみで構成されていることを確認してください。';
        } else {
            // 変換に成功した場合、XSS対策のためHTMLエンティティに変換して格納
            $convertedString = htmlspecialchars($binaryData, ENT_QUOTES, 'UTF-8');
        }
    } else {
        // 入力が空の場合
        $errorMessage = '16進数文字列が入力されていません。';
    }
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>PHP hex2bin Online Converter</title>
    <style>
        body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; background-color: #f4f4f9; color: #333; margin: 0; padding: 2rem; }
        .container { max-width: 700px; margin: auto; background-color: #fff; padding: 2rem; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        h1 { color: #333; }
        form { margin-top: 1.5rem; }
        label { display: block; font-weight: bold; margin-bottom: 0.5rem; }
        input[type="text"] { width: 100%; padding: 0.75rem; border: 1px solid #ddd; border-radius: 4px; font-size: 1rem; box-sizing: border-box; }
        input[type="submit"] { display: block; width: 100%; padding: 0.75rem; margin-top: 1rem; background-color: #007bff; color: white; border: none; border-radius: 4px; font-size: 1rem; cursor: pointer; }
        input[type="submit"]:hover { background-color: #0056b3; }
        .output { margin-top: 1.5rem; }
        .error { background-color: #f8d7da; color: #721c24; padding: 1rem; border: 1px solid #f5c6cb; border-radius: 4px; }
        .result { background-color: #e2e3e5; padding: 1rem; border-radius: 4px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New", Courier, monospace; }
    </style>
</head>
<body>
    <div class="container">
        <h1>PHP <code>hex2bin()</code> オンラインコンバーター</h1>
        <p>16進数でエンコードされた文字列を、元のバイナリデータ(文字列)に変換します。</p>
        
        <form action="<?= htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'UTF-8') ?>" method="POST">
            <div>
                <label for="hex_string">16進数文字列:</label>
                <input type="text" id="hex_string" name="hex_string" value="<?= htmlspecialchars($inputHex, ENT_QUOTES, 'UTF-8') ?>" placeholder="例: 706870206865783262696e206f6e6c696e65">
            </div>
            <input type="submit" value="変換する">
        </form>

        <div class="output">
            <?php if ($errorMessage !== ''): ?>
                <p class="error"><?= $errorMessage ?></p>
            <?php endif; ?>

            <?php if ($convertedString !== ''): ?>
                <h2>変換結果:</h2>
                <pre class="result"><?= $convertedString ?></pre>
            <?php endif; ?>
        </div>
    </div>
</body>
</html>

PHPのhex2bin関数は、16進数で表現された文字列を、元のバイナリデータ(通常の文字列)に変換するために使用されます。この関数は、string $stringという引数を受け取り、変換したい16進数文字列を指定します。例えば、「706870」という16進数文字列を渡すと、「php」という通常の文字列に変換されるといった具合です。関数の実行が成功した場合、string型の変換済み文字列が戻り値として返されますが、入力が不正である(例えば、文字列の長さが奇数である、または16進数以外の文字が含まれる)場合には、falseが戻り値として返されます。

提供されたサンプルコードは、このhex2bin関数を利用したオンラインコンバーターの例です。Webフォームを通じてユーザーが入力した16進数文字列をhex2binで変換し、その結果を表示します。POSTメソッドで送信された入力を受け取り、入力値が空でないことを確認した後、hex2bin関数で変換を試みます。変換に失敗しfalseが返された場合には、エラーメッセージを表示してユーザーに適切な入力を促すよう処理されています。また、変換された結果を出力する際には、htmlspecialchars関数を用いてXSS(クロスサイトスクリプティング)などのセキュリティ上のリスクを低減する処理も行っています。このように、hex2bin関数はデータのエンコード解除に広く利用され、セキュリティも考慮した実践的なプログラミングの例として理解できます。

hex2bin関数は、引数の文字列長が奇数であったり、16進数以外の文字が含まれていたりすると変換に失敗します。その際、この関数は警告を発生させfalseを返すため、サンプルコードのように@演算子で警告を抑制し、戻り値がfalseかどうかを厳密な比較===で判定するのが安全なエラー処理の方法です。最も重要な点はセキュリティ対策です。ユーザーの入力を元に変換した文字列には、悪意のあるスクリプトが含まれている可能性があります。これをそのままHTMLに出力するとXSS脆弱性となるため、htmlspecialchars()関数で必ずエスケープ処理を行ってください。

PHP hex2bin 失敗例と挙動を理解する

<?php

/**
 * hex2bin関数が「使えない」状況、つまり失敗するケースを実演します。
 *
 * hex2binは、引数として渡された文字列が有効な16進数でない場合に false を返します。
 * このサンプルでは、どのような場合に変換が失敗するのかを示します。
 */
function checkHex2binBehavior(): void
{
    // --- 失敗例1: 16進数ではない文字('G')が含まれている ---
    // 'G'は16進数(0-9, a-f, A-F)ではないため、変換に失敗します。
    $invalidHexString1 = '48656c6c6f20576f726c4G';

    echo '--- 失敗例1: 不正な文字を含む ---' . PHP_EOL;
    echo '入力値: ' . $invalidHexString1 . PHP_EOL;

    $result1 = hex2bin($invalidHexString1);

    if ($result1 === false) {
        echo '結果: 変換に失敗し、falseが返されました。' . PHP_EOL;
        echo '理由: 16進数として不正な文字が含まれています。' . PHP_EOL;
    }

    echo PHP_EOL;


    // --- 失敗例2: 文字列の長さが奇数 ---
    // 16進数文字列は2文字で1バイトを表すため、文字列長は偶数である必要があります。
    $invalidHexString2 = '48656c6c6f'; // 最後の1文字が欠けている

    echo '--- 失敗例2: 文字列長が奇数 ---' . PHP_EOL;
    echo '入力値: ' . $invalidHexString2 . PHP_EOL;

    $result2 = hex2bin($invalidHexString2);

    if ($result2 === false) {
        echo '結果: 変換に失敗し、falseが返されました。' . PHP_EOL;
        echo '理由: 文字列の長さが奇数です。' . PHP_EOL;
    }

    echo PHP_EOL;


    // --- 成功例(比較のため) ---
    // 有効な16進数文字列 "Hello World"
    $validHexString = '48656c6c6f20576f726c64';

    echo '--- 成功例 ---' . PHP_EOL;
    echo '入力値: ' . $validHexString . PHP_EOL;

    $binaryData = hex2bin($validHexString);

    // 戻り値が false でないことを確認してから使用するのが安全な実装です。
    if ($binaryData !== false) {
        echo '結果: ' . $binaryData . PHP_EOL;
    }
}

// 関数を実行します
checkHex2binBehavior();

PHPのhex2bin関数は、16進数文字列をバイナリデータに変換する関数です。引数には16進数文字列$stringを指定します。正常に変換できた場合は変換後のバイナリデータが文字列として返され、変換に失敗した場合はfalseが返されます。

このサンプルコードでは、hex2bin関数が失敗するケースを具体的に示しています。1つ目の失敗例は、引数に16進数として無効な文字(0-9, a-f, A-F以外)が含まれている場合です。この場合、hex2bin関数はfalseを返します。2つ目の失敗例は、引数として渡された文字列の長さが奇数の場合です。16進数文字列は2文字で1バイトを表すため、文字列長は偶数でなければなりません。奇数の場合はfalseが返されます。

対照的に、成功例では、有効な16進数文字列をhex2bin関数に渡しています。この場合は、対応するバイナリデータが文字列として返されます。hex2bin関数の戻り値を使用する際は、falseでないことを確認してから利用することで、エラーを回避できます。このように、hex2bin関数を使う際には、入力文字列が有効な16進数文字列であること、そして文字列の長さが偶数であることを確認することが重要です。

hex2bin()関数を使う際の注意点です。引数の文字列は、有効な16進数(0-9, a-f, A-F)のみで構成されている必要があります。これ以外の文字が含まれていると、falseが返されます。また、16進数文字列は2文字で1バイトを表すため、文字列の長さは偶数である必要があります。奇数の場合もfalseが返されます。hex2bin()の戻り値がfalseでないことを確認してから、変換後の値を利用するようにしてください。これにより、エラーを未然に防ぎ、安全なコードを作成できます。

【PHP8.x】hex2bin関数の使い方 | いっしー@Webエンジニア