In der PHP -Entwicklung ist es häufig erforderlich, Daten zu codieren und zu dekodieren, insbesondere wenn es um Netzwerkübertragung oder Dateispeicher geht. JSON_DECODE () ist eine häufige Funktion, um JSON -Daten in PHP -Arrays oder -Objekte zu analysieren, während die Funktion pack () Daten für eine einfache Übertragung und Speicherung in Binärzeichenfolge verpacken kann. In diesem Artikel wird detailliert erläutert, wie die von JSON_DECODE () erhaltenen Array -Ergebnisse in Binärdaten mit Pack () in Binärdaten erhalten werden.
JSON_DECODE (String $ json, bool $ assoc = true)
Pariert die JSON -Zeichenfolge, der zweite Parameter ist wahr und gibt das assoziative Array zurück, und das Objekt ist falsch .
Pack (String $ -Format, gemischte $ args ...)
Packen Sie die Parameter basierend auf den Formatzeichen in binäre Zeichenfolgen. Das Formatzeichen bestimmt den Typ und die Länge jedes Parameters.
Angenommen, es gibt die folgenden JSON -Daten:
{
"id": 123,
"temperature": 36.5,
"status": 1
}
Nachdem wir JSON_DECODE () verwendet haben, um es in ein Array umzuwandeln, hoffen wir, Pack () in Binärdaten für eine bequeme Netzwerkübertragung zu packen.
<?php
// JSON Daten
$json = '{"id":123,"temperature":36.5,"status":1}';
// verwenden json_decode Als assoziatives Array lösen
$data = json_decode($json, true);
// Bestätigen Sie die Analyseergebnisse
// var_dump($data);
// 假设Daten格式如下:
// id: 32Unsigned Ganzzahl (N)
// temperature: Schwimmende Punktzahl,32Genauigkeit der Einheit (f)
// status: 8Unsigned Ganzzahl (C)
// Beachten:pack Nicht unterstützt 64位Schwimmende Punktzahl格式,只能verwenden单精度或双精度(d)
// Wählen Sie hier einzelne Präzision(f)
$binary = pack(
'NfC', // Formatzeichen:N - 32Nicht signierte Ganzzahlen für ein bisschen Endiantheit, f - Schwimmende Punktzahl, C - 8Unsigned Ganzzahl
$data['id'],
$data['temperature'],
$data['status']
);
// 输出二进制Daten的十六进制表示,Leicht zu sehen
echo bin2hex($binary);
?>
N stellt eine 32-Bit-Unsigned Big-Endian Integer (Network Endian) dar, die für die Übertragung und plattformübergreifend geeignet ist.
F repräsentiert eine 32-Bit-Schwimmpunktzahl mit einer Präzision.
C repräsentiert eine 8-Bit-nicht signierte Ganzzahl.
Hier ist die ID als Netzwerk -Endian -Ganzzahl verpackt, die Temperatur ist eine schwimmende Punktzahl und der Status ist ein Byte.
Um die Richtigkeit der Verpackung zu überprüfen, können Sie sie mit der Funktion pack () auspacken:
<?php
// 之前打包后的二进制Daten
$binary = pack('NfC', 123, 36.5, 1);
// Auspacken,Formatzeichen必须与打包时对应
$unpacked = unpack('Nid/ftemperature/Cstatus', $binary);
print_r($unpacked);
?>
Ausgabe:
Array
(
[id] => 123
[temperature] => 36.5
[status] => 1
)
Wenn JSON mehrdimensionale Arrays oder Zeichenfolgen enthält, müssen Sie zuerst ein binäres Format entwerfen. Gemeinsame Praktiken sind:
Felder mit fester Länge werden in einem festen Format verpackt;
Saiten sind in Länge + Inhalt verpackt, wie z. B. Pack ('N', Strlen ($ str)). $ str ;
Array -Verpackungsschleife.
Beispiel:
<?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 4Byte
$binary .= pack('N', $nameLen); // Name Länge 4Byte
$binary .= $name; // Name Zeichenfolge
}
echo bin2hex($binary);
?>
JSON_DECODE () spricht JSON -Zeichenfolgen in PHP -Arrays an;
pack () packt Daten gemäß dem benutzerdefinierten Format in Binary;
Das Format muss unter Berücksichtigung der Feldlänge und der Feldtyp entworfen werden, insbesondere die Zeichenfolge, die seine eigenen Längeninformationen benötigt.
Kombiniert mit pack (), um die Richtigkeit der Daten zu überprüfen.
Ausführlichere Formatbeschreibungen von Packfunktionen finden Sie in der offiziellen PHP -Dokumentation .