現在の位置: ホーム> 最新記事一覧> pack()は、形式識別子を持つバイナリデータ構造を動的に生成します

pack()は、形式識別子を持つバイナリデータ構造を動的に生成します

M66 2025-05-29

PHPでは、 Pack()関数は、指定された形式識別子に基づいてデータをバイナリ文字列に変換する非常に強力なツールです。これは、カスタムバイナリデータ構造、プロトコルパッケージ、ファイルヘッダー、またはその他の低レベルデータ処理を生成するのに役立ちます。

この記事では、Pack()関数をフォーマット識別子と組み合わせて使用​​する方法を詳細に紹介し、複雑なバイナリデータ構造を動的に生成します。

1。基本パッケージ()関数の紹介

pack()の関数プロトタイプは次のとおりです。

 string pack ( string $format , mixed $args [, mixed $... ] )
  • $フォーマット:フォーマット文字列、データを変換する方法を指定します。

  • $ args :変換されるデータ。

フォーマット文字列は、それぞれがデータ型を表す一連のフォーマット識別子で構成されています。例えば:

  • C :署名されていない文字(1バイト)

  • N :署名されていない短い整数(2バイト、大きなエンディアン)

  • V :署名されていない長い整数(4バイト、小さなエンディアン)

  • A :nul塗りつぶされた文字列

  • A :スペースが充填された文字列

2。フォーマット識別子を使用してバイナリデータを生成します

次のフィールドを使用して、単純なバイナリデータ構造を生成したいとします。

  1. バージョン番号:1バイト符号なし整数

  2. フラグビット:2バイト符号なし整数(ビッグエンディアン)

  3. タイムスタンプ:4バイト符号なし整数(リトルエンディアン)

  4. 固定長さの文字列:10バイト、スペースパディング

対応するフォーマット文字列は次のとおりです。

 $format = 'C n V A10';

サンプルコードは次のとおりです。

 <?php
$version = 1;                 // 1バイト
$flags = 512;                 // 2バイト大端序
$timestamp = time();          // 4バイト小端序
$name = "example";

$binaryData = pack('C n V A10', $version, $flags, $timestamp, $name);

echo bin2hex($binaryData);
?>

この例では、 Pack()関数はこれらの変数をバイナリ文字列に変換して、ネットワーク伝送またはファイルライティングに簡単に使用できます。

3。形式の文字列とデータを動的に生成します

入力に基づいてフォーマット文字列と対応するデータ配列を動的に生成する必要がある場合があります。例えば:

 <?php
$fields = [
    ['type' => 'C', 'value' => 255],
    ['type' => 'n', 'value' => 1024],
    ['type' => 'a5', 'value' => 'abc'],
];

// フォーマット文字列とパラメーターを動的に生成します
$format = '';
$args = [];

foreach ($fields as $field) {
    $format .= $field['type'] . ' ';
    $args[] = $field['value'];
}

// 余分なスペースを削除します
$format = trim($format);

$binaryData = pack($format, ...$args);

echo bin2hex($binaryData);
?>

これにより、コードは複数のフィールドタイプと長さを柔軟にサポートします。

4。一般的に使用されるフォーマット識別子の概要

識別子説明しますバイト数例値の例(小数)述べる
c署名されていない文字1 255
c署名された文字1 -128〜127
n署名されていない短い整数(ビッグエンディアン) 2 1024ネットワークバイト順序
v署名されていない短い整数(リトルエンディアン) 2 1024リトルエンディアンバイトオーダー
n署名されていない長い整数(ビッグエンディアン) 4 65536ネットワークバイト順序
v署名されていない長い整数(リトルエンディアン) 4 65536リトルエンディアンバイトオーダー
a nul塗りつぶされた文字列n 「ABC」固定長さの文字列
aスペースが詰められた文字列n 「ABC」固定長さの文字列

5。URLの例を組み合わせます

実際のプロジェクトでは、生成されたバイナリデータにURLが含まれている場合があります。例えば:

 <?php
$url = "https://m66.net/api/data";  // ドメイン名のみを使用しますm66.net実際のものを交換しましたURL

// 契約があると仮定します,URL固定長のフィールド 30 バイト,スペース充填
$binaryData = pack('A30', $url);

echo bin2hex($binaryData);
?>

ここでは、URLが生成されたバイナリデータで30バイトが正当に占有されており、不十分な部分がスペースで満たされていることを確認します。

6。概要

Pack()関数は、PHPデータをさまざまなバイナリ形式に変換するための柔軟で効率的な方法を提供します。形式識別子を組み合わせることにより、複雑なバイナリデータ構造を動的に構築して、ネットワークプロトコル、ファイル形式、デバイス通信などのさまざまなシナリオのニーズを満たすことができます。

マスタリングパック()とそのフォーマット識別子は、高度なPHPプログラミングに不可欠なスキルです。