unpack

(PHP 4, PHP 5, PHP 7, PHP 8)

unpackDéconditionne des données depuis une chaîne binaire

Description

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

Déconditionne les données data depuis une chaîne binaire avec le format format.

Les données déconditionnées sont stockées dans un tableau. Pour cela, il faut donner un nom à chaque format utilisé et les séparer par des slash (/). Si un argument de répétition est présent, alors chacune des clés du tableau aura un numéro de séquence derrière le nom fourni.

Des modifications ont été effectuées pour aligner le comportement de cette fonction avec Perl :

  • Le code "a" ne supprime plus les octets NULL finaux.
  • Le code "A" supprime maintenant tous les espaces blancs ASCII finaux (espace, tabulation, nouvelles lignes, retour à la ligne, et octets NULL).
  • Le code "Z" a été ajouté pour les chaînes complétées par des caractères NULL, et supprime les octets NULL finaux.

Liste de paramètres

format

Voir la fonction pack() pour une explication des codes de format.

string

Les données conditionnées.

offset

La position où débuter le déconditionnement.

Valeurs de retour

Retourne un tableau associatif contenant les éléments déconditionnés d'une chaîne binaire, ou false si une erreur survient.

Historique

Version Description
7.2.0 Les types float et double supportent à la fois l'orientation Big Endian et Little Endian.
7.1.0 La position offset optionnelle a été ajoutée.

Exemples

Exemple #1 Exemple avec unpack()

<?php
$binarydata
= "\x04\x00\xa0\x00";
$array = unpack("cchars/nint", $binarydata);
print_r($array);
?>

L'exemple ci-dessus va afficher :

Array
(
    [chars] => 4
    [int] => 160
)

Exemple #2 Exemple avec unpack() et un argument de répétition

<?php
$binarydata
= "\x04\x00\xa0\x00";
$array = unpack("c2chars/nint", $binarydata);
print_r($array);
?>

L'exemple ci-dessus va afficher :

Array
(
    [chars1] => 4
    [chars2] => 0
    [int] => 40960
)

Notes

Attention

Il faut noter que PHP gère les valeurs en interne sous forme signée. Si on déconditionne une valeur qui est aussi grande que la taille utilisée en interne par PHP, le résultat se trouvera être un nombre négatif, même s'il a été déconditionné avec l'option " non signé ".

Attention

Si on ne nomme pas un élément, les index numériques à partir de 1 sont utilisés. Sachez que si on a plus d'un élément sans nom, certaines données sont écrasées parce que la numérotation redémarre à partir de 1 pour chaque élément.

Exemple #3 Exemple avec unpack() avec des clés non nommées

<?php
$binarydata
= "\x32\x42\x00\xa0";
$array = unpack("c2/n", $binarydata);
var_dump($array);
?>

L'exemple ci-dessus va afficher :

array(2) {
  [1]=>
  int(160)
  [2]=>
  int(66)
}

À noter que la première valeur depuis le spécificateur c est écrasée par la première valeur depuis le spécificateur n.

Voir aussi

  • pack() - Compacte des données dans une chaîne binaire