PHPでは、 Pack()関数は強力なバイナリデータパッケージングツールであり、ネットワーク、ファイル形式分析、その他のシナリオによって送信されるバイナリデータを生成するためによく使用されます。指定された形式の文字列に基づいて、データをバイナリ文字列に変換します。しかし、多くの開発者はしばしば「一貫性のないデータの長さが異常な行動につながる」という問題に遭遇します。この記事では、原因を詳細に分析し、それらをトラブルシューティングする方法を教えます。
pack()関数は2つのパラメーターを受け入れます。
string pack(string $format, mixed $values, mixed ...$values)
$フォーマット:フォーマット文字列、 A4などのデータのタイプと長さを定義します。A4は4バイト文字列を表し、 nは32ビットの署名されていないビッグエンディアン整数などを表します。
$値:対応する形式でデータを入力します。
データをフォーマットでパッケージ化するバイナリ文字列を返します。
A4 (固定4バイト文字列)形式を使用して4つの長さの文字列をパッケージ化すると仮定します。PHPは、通常予想される動作である空のバイトで自動的にそれを埋めます。
ただし、フォーマットがデータと一致しない場合、または数値タイプの長さが正しくない場合、次の理由を引き起こす可能性があります。
出力データは異常であるため、その後の解析障害が発生します。
ネットワークプロトコルにエラーがあり、通信は正常に行うことはできません。
ファイル形式が間違っていて、ファイルが破損しています。
例えば:
<?php
// 期待する4バイト文字列,しかし、ただ3バイト
echo bin2hex(pack('a4', 'abc')); // 61626300,最後に終了しました0バイト
// 期待する4バイト整数,しかし、文字列を渡すと例外が引き起こされます
echo bin2hex(pack('N', 'abc')); // エラーが報告されるか、予測不可能なデータが生成されます
?>
pack()のフォーマット文字列は、タイプに非常に敏感です。数字タイプ形式( N 、 Lなど)には整数データが必要で、文字列形式( A 、 Aなど)が文字列を必要とします。
<?php
$int = 1234;
$str = "hello";
// 正しい使用法
$data = pack('N', $int);
// 間違った使用法(例外を引き起こします)
$data = pack('N', $str);
?>
A4やA8などの固定長文字列形式の場合、文字列の長さが十分であるか、長すぎるかどうかを確認します。
フォーマットが不十分な場合、空のバイトに記入します
フォーマットAが不十分な場合、 Aスペースに入力します
それはあまりにも長く切断されます
<?php
echo bin2hex(pack('a4', 'abcde')); // 61626364,過剰な部分は切り捨てられます
echo bin2hex(pack('A4', 'ab')); // 61622020,後でスペースを構成します
?>
Bin2hex()関数を使用して、Pack()によって返されたバイナリデータの16進表現を表示して、期待を満たすかどうかの分析を容易にします。
<?php
$data = pack('a4N', 'abc', 1234);
echo bin2hex($data);
?>
pack()は、複数の形式文字と対応する複数の値をサポートし、順序を一致させる必要があります。
<?php
// フォーマット文字列にはあります2フォーマット文字,合格する必要があります2パラメーター
$data = pack('a4N', 'test', 100);
?>
パラメーターの数が一致しない場合、結果が正しくない場合があります。
公式マニュアルとコミュニティのチュートリアルは非常に役立ちます。サンプルコードアクセスアドレスは次のとおりです。