PHP開発では、特にネットワーク送信またはファイルストレージに関しては、データをエンコードおよびデコードする必要があることがよくあります。 JSON_DECODE()は、JSONデータをPHPアレイまたはオブジェクトに解析する一般的な関数であり、 Pack()関数はデータをバイナリ文字列にパッケージ化して、簡単に送信してストレージできます。この記事では、json_decode()が取得した配列の結果をPack()を使用してバイナリデータにパッケージ化する方法を詳細に説明します。
json_decode(string $ json、bool $ assoc = true)
json文字列を解析し、2番目のパラメーターは真であり、連想配列を返し、オブジェクトはfalseです。
pack(string $ format、mixed $ args ...)
フォーマット文字に基づいて、パラメーターをバイナリ文字列に詰めます。フォーマット文字は、各パラメーターのタイプと長さを決定します。
次のJSONデータがあるとします。
{
"id": 123,
"temperature": 36.5,
"status": 1
}
json_decode()を使用して配列に変換した後、 Pack()を使用して、便利なネットワーク伝送のためにバイナリデータにパッケージ化したいと考えています。
<?php
// JSON データ
$json = '{"id":123,"temperature":36.5,"status":1}';
// 使用 json_decode 連想配列として解決します
$data = json_decode($json, true);
// 分析結果を確認してください
// var_dump($data);
// 假设データ格式如下:
// id: 32署名されていない整数 (N)
// temperature: フローティングポイント番号,32ユニットの精度 (f)
// status: 8署名されていない整数 (C)
// 知らせ:pack サポートされていません 64位フローティングポイント番号格式,単一または二重精度のみを使用できます(d)
// ここで単一の精度を選択してください(f)
$binary = pack(
'NfC', // フォーマット文字:N - 32ビットエンディアンネスのための署名されていない整数, f - フローティングポイント番号, C - 8署名されていない整数
$data['id'],
$data['temperature'],
$data['status']
);
// 输出二进制データ的十六进制表示,見るのは簡単です
echo bin2hex($binary);
?>
nは、送信およびクロスプラットフォームに適した32ビットの署名されていないビッグエンディアン整数(ネットワークEndian)を表します。
fは、32ビットの単一精度の浮動小数点数を表します。
Cは8ビットの署名されていない整数を表します。
ここでは、 IDはネットワークエンデアン整数としてパッケージ化され、温度は浮動小数点数、ステータスはバイトです。
パッケージの正確性を確認するために、 uppack()関数で開梱できます。
<?php
// 之前打包后的二进制データ
$binary = pack('NfC', 123, 36.5, 1);
// 開梱,フォーマット文字必须与打包时对应
$unpacked = unpack('Nid/ftemperature/Cstatus', $binary);
print_r($unpacked);
?>
出力:
Array
(
[id] => 123
[temperature] => 36.5
[status] => 1
)
JSONに多次元配列または文字列が含まれている場合、最初にバイナリ形式を設計する必要があります。一般的な慣行は次のとおりです。
固定長のフィールドは、固定形式でパッケージ化されています。
文字列は、Pack( 'n'、strlen($ str))などの長さ +コンテンツでパッケージ化されています。 $ str ;
配列パッケージループ。
例:
<?php
$json = '{"users":[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]}';
$data = json_decode($json, true);
$binary = '';
foreach ($data['users'] as $user) {
$id = $user['id'];
$name = $user['name'];
$nameLen = strlen($name);
$binary .= pack('N', $id); // id 4バイト
$binary .= pack('N', $nameLen); // 名前の長さ 4バイト
$binary .= $name; // 名前文字列
}
echo bin2hex($binary);
?>
json_decode()は、JSON文字列をPHPアレイに解析します。
Pack()は、カスタム形式に従ってデータをバイナリにパッケージ化します。
フィールドの長さとタイプを考慮して、形式を設計する必要があります。特に、文字列には独自の長さの情報が必要です。
unpack()と組み合わせて、データの正しさを確認します。
パック関数のより詳細な形式の説明については、公式のPHPドキュメントを参照してください。