PHPでは、 Pack()関数は、指定された形式でデータをバイナリ文字列にパッケージ化できる強力なツールであり、データ送信、ファイルライティング、ネットワークプロトコルの実装などのシナリオで広く使用されています。この記事では、パック( "c*")を使用して配列をパッケージ化し、その使用、実用的な手法、一般的なアプリケーションを分析する方法に焦点を当てています。
Pack()関数の基本的な構文は次のとおりです。
string pack ( string $format , mixed ...$values )
$フォーマットはデータのパッケージ形式を指定し、 「C」とは、パラメーターを符号なし文字(つまり、1バイト、範囲0〜255)に変換することを意味します。 「c*」とは、符号なしの文字形式で複数の値をパッケージ化することを意味します。これは、配列内の各要素を単一のバイトとしてエンコードするのに適しています。
例えば:
$data = [65, 66, 67];
$packed = pack("C*", ...$data);
echo $packed; // 出力 ABC
このコードでは、 65はASCII文字Aに対応し、 66はBに対応し、 67はCに対応するため、最終出力は文字列「ABC」です。
パック( "c*")を介して数値の配列をバイナリデータに変換するには、一般的な手順は次のとおりです。
数値を含む配列を準備すると、配列内の値は0〜255でなければなりません。
パラメーター解放( ... )を使用してパック( "c*")をパックする複数のパラメーターとして配列を渡します。
pack()は、各数値を1つのバイトに変換し、バイナリ文字列を返します。
サンプルコード:
<?php
$array = [72, 101, 108, 108, 111]; // 対応する "Hello"
$binary = pack("C*", ...$array);
echo $binary; // 出力: Hello
?>
注: pack()はバイナリ文字列を返しますが、エコーを使用して直接出力されない場合があります。視覚的に表示したい場合は、 bin2hex()関数を使用できます。
echo bin2hex($binary); // 48656c6c6f
配列が空の場合、呼び出しパック( "c*"、... $ array)はエラーを報告します。最初に判断することをお勧めします:
if (!empty($array)) {
$binary = pack("C*", ...$array);
} else {
$binary = '';
}
pack( "c*")では、要素が0〜255の整数である必要があり、それ以外の場合は予期しない結果が発生します。 Array_mapを使用して、最初にスコープを制限できます。
$array = array_map(function($v) {
return $v & 0xFF; // 最低だけを維持します8少し
}, $array);
パッケージデータは、カスタムネットワークプロトコルでよく使用され、整数アレイをバイトストリームに変換してからリモートサーバーに送信できます。
例:
$data = [1, 2, 3, 4];
$packet = pack("C*", ...$data);
$socket = stream_socket_client("tcp://m66.net:1234");
fwrite($socket, $packet);
fclose($socket);
画像ヘッダー情報、オーディオファイル、ビデオファイルなどのバイナリ形式ファイルを記述する必要がある場合があります。
$header = [0x89, 0x50, 0x4E, 0x47]; // PNGファイル署名
file_put_contents('file.png', pack("C*", ...$header));
カスタムプロトコルが複数のフィールドを送信する場合、数値をバイトストリームに変換することが非常に一般的です。
pack( "c*")はバイト配列を文字列に変換できますが、 [c*"、$ str)は逆操作を実装し、エンコードとデコードを容易にすることができます。
pack( "c*")は、バイト形式のバイナリ文字列に整数の配列をパッケージ化するために使用されます。
配列要素は0〜255でなければならず、最初に空の配列をチェックする必要があります。
ネットワーク伝送、ファイルライティング、プロトコル開発などのさまざまなシナリオに適しています。
[[C*])を使用して双方向変換を実現し、バイトデータを処理できるようになります。
Pack( "c*")を合理的に使用することにより、バイナリデータを効率的に処理し、低レベルのデータ相互作用においてPHPをより強力にすることができます。