現在の位置: ホーム> 最新記事一覧> json_decode()の配列結果をバイナリデータとしてパッケージ化します

json_decode()の配列結果をバイナリデータとしてパッケージ化します

M66 2025-05-31

PHP開発では、特にネットワーク送信またはファイルストレージに関しては、データをエンコードおよびデコードする必要があることがよくあります。 JSON_DECODE()は、JSONデータをPHPアレイまたはオブジェクトに解析する一般的な関数であり、 Pack()関数はデータをバイナリ文字列にパッケージ化して、簡単に送信してストレージできます。この記事では、json_decode()が取得した配列の結果をPack()を使用してバイナリデータにパッケージ化する方法を詳細に説明します。


1。JSON_DECODE()とpack()を理解する

  • json_decode(string $ json、bool $ assoc = true)
    json文字列を解析し、2番目のパラメーターはであり、連想配列を返し、オブジェクトはfalseです。

  • pack(string $ format、mixed $ args ...)
    フォーマット文字に基づいて、パラメーターをバイナリ文字列に詰めます。フォーマット文字は、各パラメーターのタイプと長さを決定します。

2。シーンの例

次のJSONデータがあるとします。

 {
  "id": 123,
  "temperature": 36.5,
  "status": 1
}

json_decode()を使用して配列に変換した後、 Pack()を使用して、便利なネットワーク伝送のためにバイナリデータにパッケージ化したいと考えています。


3.サンプルコードの説明

<?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);
?>

4。コードの説明

  • nは、送信およびクロスプラットフォームに適した32ビットの署名されていないビッグエンディアン整数(ネットワークEndian)を表します。

  • fは、32ビットの単一精度の浮動小数点数を表します。

  • Cは8ビットの署名されていない整数を表します。

ここでは、 IDはネットワークエンデアン整数としてパッケージ化され、温度は浮動小数点数、ステータスはバイトです。


5。バイナリデータからの例の梱包例

パッケージの正確性を確認するために、 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
)

6.より複雑なJSON構造を処理します

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);
?>

7。概要

  • json_decode()は、JSON文字列をPHPアレイに解析します。

  • Pack()は、カスタム形式に従ってデータをバイナリにパッケージ化します。

  • フィールドの長さとタイプを考慮して、形式を設計する必要があります。特に、文字列には独自の長さの情報が必要です。

  • unpack()と組み合わせて、データの正しさを確認します。

パック関数のより詳細な形式の説明については、公式のPHPドキュメントを参照してください。