PHPでは、 Pack()関数を使用して、指定された形式のバイナリ文字列にデータをパッケージ化します。これは、ネットワーク転送、ファイルの書き込み、Cまたは他の低レベルの言語とのやり取りを扱う場合に役立ちます。この記事では、Pack()関数の使用について詳細に説明し、例を組み合わせて、データをバイナリ形式にパッケージ化する方法を示します。
pack()の基本的な構文は次のとおりです。
string pack(string $format, mixed $values, mixed ...$values)
$フォーマット:1つ以上のフォーマットコードで構成されるデータの形式を指定します。
$値:パッケージ化される値は、複数のパラメーターにすることができます。
戻り値は、指定された形式でパッケージ化されたバイナリ文字列です。
フォーマットコード | 説明する | 例 |
---|---|---|
a | nul文字が塗りつぶされた文字列 | pack( 'a4'、 'abc') |
a | スペースが詰められた文字列 | pack( 'a4'、 'abc') |
c | 署名された文字(1バイト) | pack( 'c'、65) |
c | 署名されていない文字(1バイト) | pack( 'c'、65) |
s | 署名された短い整数(2バイト) | pack( 's'、1234) |
s | 署名されていない短い整数(2バイト) | pack( 's'、1234) |
私 | 署名された整数(マシンワードの長さ) | pack( 'i'、123456) |
私 | 署名されていない整数(マシンワードの長さ) | pack( 'i'、123456) |
l | 署名された長い整数(4バイト) | pack( 'l'、123456) |
l | 署名されていない長い整数(4バイト) | pack( 'l'、123456) |
f | フローティングポイント番号(4バイト) | pack( 'f'、3.14) |
d | 二重精度の浮動小数点数(8バイト) | pack( 'd'、3.14) |
n | 署名されていない短い整数(16ビットのビッグエンディアンエンディアン) | pack( 'n'、1234) |
n | 署名されていない長い整数(32ビットのビッグエンディアンエンディアン) | pack( 'n'、1234) |
<?php
// 1つの長さを詰めます4文字列と1つ32少し署名されていないビッグエンディアン整数
$packed = pack('a4N', 'test', 123456789);
echo bin2hex($packed);
?>
ここでは、「A4」は長さ4の文字列を梱包することを意味し、不十分な部分はNUL文字で満たされています。 'n'とは、32ビットの署名のないビッグエンディアン整数を梱包することを意味します。 bin2hex()は、バイナリコンテンツを16進数に変換して、簡単に表示します。
コマンドタイプ(1バイト)とデータの長さ(4バイトのビッグエンディアン)を含む単純なネットワークパケットを構築する必要があると仮定し、次にデータ本文を作成します。
<?php
$command = 1; // コマンドタイプ,1バイト
$data = "Hello, m66.net!"; // データ本文
$length = strlen($data); // データの長さ
// 打包コマンドタイプ和データの長さ
$header = pack('CN', $command, $length);
// 完全なデータパケットのスプライシング
$packet = $header . $data;
// 出力パッケージの16進表現
echo bin2hex($packet);
?>
上記のコードでは、 「C」パッケージコマンドタイプ(1バイトの符号なし整数)、および「n」パッケージデータ長(4バイトのBig-Endian Integer)。データボディはそのままスプライスされています。
<?php
$number = 65535;
$packed = pack('n', $number); // 按大端バイト序打包为16署名されていない整数
echo 'Packed data: ' . bin2hex($packed) . PHP_EOL;
$unpacked = unpack('nvalue', $packed); // 開梱
echo 'Unpacked value: ' . $unpacked['value'] . PHP_EOL;
?>
Pack()は、特にネットワークプログラミングや基礎となるデータ処理に適したバイナリデータを操作するための強力なツールです。フォーマットコードを使用することに熟練することにより、バイトの配置とデータの種類を正確に制御できます。