unpack în PHP

Șiruri de caractere PHP 4+ (parametrul $offset: PHP 7.1+)

Citește numere și texte din date binare, după un format.

Sintaxă
unpack(string $format, string $string, int $offset = 0): array|false

Ce face unpack

unpack face inversul lui pack: citește datele binare și returnează un tablou cu valorile. În format, fiecare literă poate fi urmată de un nume, iar elementele se separă cu /: "Nid/ncantitate" dă cheile id și cantitate.

Fără nume, cheile sunt numerotate de la 1, nu de la 0. Cu * după literă citești toate valorile rămase, de exemplu "C*" pentru toți octeții.

Parametri

Parametru Descriere
$format Formatul, cu nume opționale pentru fiecare valoare.
$string Datele binare.
$offset Opțional. Poziția de la care începe citirea.

Ce returnează

Un tablou cu valorile sau false la eroare.

Exemple

Exemplul 1: Valori cu nume

<?php
$date = pack("NnA8", 1024, 3, "Iasi");

print_r(unpack("Nid/ncantitate/A8oras", $date));

Rezultat

Array
(
    [id] => 1024
    [cantitate] => 3
    [oras] => Iasi
)

Exemplul 2: Dimensiunile unei imagini PNG

Într-un fișier PNG, lățimea și înălțimea sunt numere pe 4 octeți, de la poziția 16.

<?php
$png = "\x89PNG\r\n\x1a\n" . pack("N", 13) . "IHDR" . pack("NN", 800, 600);

$dim = unpack("Nlatime/Ninaltime", $png, 16);
echo $dim["latime"] . " x " . $dim["inaltime"];

Rezultat

800 x 600

Greșeli frecvente

  • Citești unpack("C*", $date)[0] și primești Undefined array key 0. Cheile fără nume încep de la 1.

Comenzi înrudite

  • pack: Transformă valori în date binare după un format, de exemplu un număr pe 4 octeți.
  • fread: Citește un număr dat de octeți dintr-un fișier deschis.
  • bin2hex / hex2bin: bin2hex transformă un text (sau date binare) în cifre hexazecimale, iar hex2bin face inversul.