Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】sodium_hex2bin()関数の使い方

sodium_hex2bin関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

sodium_hex2bin関数は、16進数形式で表現された文字列を、対応するバイナリデータ(生のバイト列)に変換する関数です。この関数は、セキュアな暗号化ライブラリであるLibsodiumのPHP拡張機能の一部として提供されており、主に暗号化やハッシュ化されたデータの処理に利用されます。

プログラムが暗号化されたデータやハッシュ値を扱う際、それらはしばしば人間が読みやすいように「00」「0F」「FF」といった16進数文字の並びで表現されます。しかし、これらのデータを実際にコンピュータで処理したり、別の暗号化関数に渡したりする場合には、元のバイナリ形式に戻す必要があります。sodium_hex2bin関数は、そのような場合に安全かつ正確に形式を変換するために使用されます。

この関数は、変換したい16進数文字列を引数として受け取ります。そして、正常に変換が完了した場合、その文字列に対応するバイナリデータを返します。もし、引数として与えられた文字列に無効な16進数文字(例えば、「G」や「Z」など)が含まれていたり、文字列の長さが奇数であったりするなど、有効な16進数文字列でない場合には、エラーが発生します。セキュリティ関連の処理において、データの整合性を保ちつつ、異なる形式間で安全にデータをやり取りする上で非常に重要な役割を果たします。

構文(syntax)

1<?php
2$hex_string = "6d795f64617461"; // 16進数文字列の例
3$binary_data = sodium_hex2bin($hex_string);
4?>

引数(parameters)

string $string, string $ignore = ''

  • string $string: 16進数形式の文字列
  • string $ignore = '': 16進数文字列から無視する文字を指定する文字列。デフォルトは空文字列

戻り値(return)

string

16進数文字列をバイナリ文字列に変換した結果を返します。

サンプルコード

sodium_hex2binで16進数をバイナリに変換する

1<?php
2
3/**
4 * sodium_hex2bin関数の使用例
5 * 16進数文字列をバイナリ文字列に安全に変換します。
6 * この関数はLibsodium拡張機能の一部であり、主に暗号関連の処理で使用されます。
7 */
8
9// 変換する16進数文字列を定義します。
10// 例: "48656c6c6f" はASCII文字 "Hello" を16進数で表したものです。
11$hexString = "48656c6c6f";
12
13echo "元の16進数文字列: " . $hexString . PHP_EOL;
14
15// sodium_hex2bin関数を呼び出して、16進数文字列をバイナリ文字列に変換します。
16// 戻り値は生のバイナリデータです。
17$binaryString = sodium_hex2bin($hexString);
18
19// 変換後のバイナリ文字列を出力します。
20// バイナリデータはそのまま表示すると文字化けする可能性がありますが、
21// 元の16進数がASCII文字を表す場合は、ASCIIとして解釈できます。
22echo "変換後のバイナリ文字列 (ASCIIとして表示): " . $binaryString . PHP_EOL;
23
24// 検証のため、変換されたバイナリ文字列を再度16進数に戻してみます。
25// bin2hex関数は、バイナリデータを16進数文字列に変換します。
26$reconvertedHex = bin2hex($binaryString);
27echo "バイナリ文字列を再度16進数に戻した結果: " . $reconvertedHex . PHP_EOL;
28
29// 元の16進数文字列と再度変換した16進数文字列が一致することを確認できます。
30if ($hexString === $reconvertedHex) {
31    echo "変換と再変換が正しく行われました。" . PHP_EOL;
32} else {
33    echo "変換に問題が発生しました。" . PHP_EOL;
34}
35
36?>

PHP 8のsodium_hex2bin関数は、Libsodium拡張機能の一部であり、16進数形式の文字列を安全にバイナリ形式の文字列へ変換するために使用されます。主に暗号処理などのセキュリティ関連で利用される関数です。この関数は引数として変換したい16進数文字列(string $string)を受け取り、対応する生のバイナリデータを含む文字列を返します。

サンプルコードでは、"48656c6c6f"という16進数文字列を定義しています。これはASCIIで"Hello"を表現したものです。この文字列をsodium_hex2bin関数に渡すことで、"Hello"というバイナリ文字列が生成されます。生のバイナリデータはそのまま表示すると文字化けすることがありますが、元の16進数がASCIIを表す場合は意図した文字として表示されます。コードの後半では、変換後のバイナリ文字列をbin2hex関数で再度16進数に戻し、元の文字列と一致するかを確認することで、sodium_hex2bin関数が正しく機能したことを検証しています。この関数は、16進数で表現されたデータをプログラム内で安全に利用する際に役立ちます。

この関数はPHPのLibsodium拡張機能が必須であり、サーバーにインストール・有効化されていないと関数が見つからないエラーになる点にご注意ください。戻り値は生のバイナリ文字列のため、そのまま画面出力すると文字化けする場合があります。暗号化などのセキュリティ関連で利用されることが多く、変換されたバイナリデータはファイル保存やネットワーク送信時に適切なバイナリデータとして扱う必要があります。サンプルコードのようにbin2hex関数と組み合わせて、変換の正しさを検証することは、データの整合性を確認する上で良い習慣です。通常のhex2bin関数との違いも意識し、セキュリティが求められる場面で活用しましょう。

PHP 8 sodium_hex2bin で16進数文字列をバイナリに変換する

1<?php
2
3// PHP 8 の sodium_hex2bin 関数の使用例です。
4// この関数は、16進数形式の文字列をバイナリ形式の文字列に変換します。
5// キーワードとして挙げられている sodium_bin2hex と合わせて、相互変換の例を示します。
6
7// 1. 元のバイナリデータを準備します。
8// 例として、16バイトのランダムなデータを生成します。
9$originalBinaryData = random_bytes(16);
10
11echo "--- 変換前のデータ ---\n";
12// バイナリデータは直接表示すると文字化けする可能性があるため、
13// sodium_bin2hex を使って16進数形式で表示します。
14echo "元のバイナリデータ (16進数表現): " . sodium_bin2hex($originalBinaryData) . "\n\n";
15
16// 2. sodium_bin2hex を使ってバイナリデータを16進数文字列に変換します。
17$hexString = sodium_bin2hex($originalBinaryData);
18echo "--- sodium_bin2hex による変換 ---\n";
19echo "16進数文字列: " . $hexString . "\n\n";
20
21// 3. sodium_hex2bin を使って16進数文字列を元のバイナリデータに戻します。
22// 第2引数 $ignore は省略可能です。ここでは標準的な変換のため指定しません。
23$convertedBinaryData = sodium_hex2bin($hexString);
24echo "--- sodium_hex2bin による変換 (元に戻す) ---\n";
25echo "再変換されたバイナリデータ (16進数表現): " . sodium_bin2hex($convertedBinaryData) . "\n\n";
26
27// 4. 元のバイナリデータと再変換したデータが一致するか確認します。
28echo "--- 検証 ---\n";
29if ($originalBinaryData === $convertedBinaryData) {
30    echo "検証結果: 元のバイナリデータと再変換されたデータは完全に一致しました。\n";
31} else {
32    echo "検証結果: エラー - データが一致しません。\n";
33}
34
35// 5. sodium_hex2bin の第2引数 $ignore の使用例
36// 16進数文字列中に無視したい文字(例: スペース)がある場合に使用します。
37$hexStringWithIgnoredChars = "1a 2b 3c d4";
38echo "\n--- sodium_hex2bin の '$ignore' 引数の使用例 ---\n";
39echo "無視文字を含む16進数文字列: '" . $hexStringWithIgnoredChars . "'\n";
40
41// スペースを無視して変換
42$convertedWithIgnore = sodium_hex2bin($hexStringWithIgnoredChars, ' ');
43echo "スペースを無視して変換後のバイナリデータ (16進数表現): " . sodium_bin2hex($convertedWithIgnore) . "\n";
44
45// 正しい変換結果と比較するために、PHP標準のhex2bin関数で期待されるバイナリデータを作成します。
46$expectedBinaryResultForIgnore = hex2bin('1a2b3cd4'); 
47if ($convertedWithIgnore === $expectedBinaryResultForIgnore) {
48    echo "検証結果: 無視文字を考慮した変換は正しく行われました。\n";
49} else {
50    echo "検証結果: エラー - 無視文字を考慮した変換が正しくありません。\n";
51}
52
53?>

PHP 8のsodium_hex2bin関数は、PHPのSodium拡張が提供する機能の一つで、16進数形式で表現された文字列をバイナリ形式の文字列に変換します。この関数は、第一引数$stringに変換したい16進数文字列を受け取り、処理が成功するとバイナリ文字列を返します。

サンプルコードでは、まずrandom_bytes関数で生成したバイナリデータを、キーワードであるsodium_bin2hex関数を使って16進数文字列に変換しています。次に、sodium_hex2bin関数を使用して、この16進数文字列を再び元のバイナリデータへと変換し、正しく相互変換できることを検証しています。

オプションの第二引数$ignoreには、変換対象の16進数文字列中に存在しても無視したい文字を指定できます。例えば、16進数表記の数字の間にスペースが混ざっている場合などに、そのスペースを無視して正しくバイナリへ変換することが可能です。この関数は、主に暗号化やデータ署名など、セキュリティが求められる場面での安全なデータ形式変換に利用されます。

sodium_hex2bin関数を利用する際は、PHPのsodium拡張機能が有効になっているか必ず確認してください。この関数は16進数文字列をバイナリデータに変換するため、入力文字列は偶数長で、厳密に16進数文字(0-9, a-f, A-F)のみで構成されている必要があります。不適切な入力は予期せぬ結果を招く可能性があります。第2引数$ignoreは指定した文字を変換前に無視しますが、セキュリティ上のリスクやデータ破損を防ぐため、その使用は慎重に行うべきです。変換後のデータはバイナリ形式ですので、内容を画面に表示する際はsodium_bin2hex関数で16進数表現に変換してから出力することをお勧めします。これらの関数は暗号処理に関連するため、データの整合性と安全性を確保するためにも、正確な理解と慎重な利用を心がけてください。

関連コンテンツ

関連プログラミング言語