unpack

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

unpackDesempaqueta datos desde una cadena binaria

Descripción

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

Desempaqueta los datos data desde una cadena binaria con el formato format.

Los datos desempaquetados se almacenan en un array. Para ello, debe asignarse un nombre a cada formato utilizado y separarlos con una barra (/). Si se proporciona un argumento de repetición, entonces cada una de las claves del array tendrá un número de secuencia detrás del nombre proporcionado.

Se han realizado modificaciones para alinear el comportamiento de esta función con Perl :

  • El código "a" ya no elimina los bytes NULL finales.
  • El código "A" ahora elimina todos los espacios en blanco ASCII finales (espacio, tabulación, nuevas líneas, retorno de carro, y bytes NULL).
  • Se ha añadido el código "Z" para las cadenas rellenas con caracteres NULL, y elimina los bytes NULL finales.

Parámetros

format

Consulte la función pack() para una explicación de los códigos de formato.

string

Los datos empaquetados.

offset

La posición donde comenzar el desempaquetado.

Valores devueltos

Devuelve un array asociativo que contiene los elementos desempaquetados de una cadena binaria, o false en caso de error.

Historial de cambios

Versión Descripción
7.2.0 Los tipos float y double soportan tanto la orientación Big Endian como Little Endian.
7.1.0 Se ha añadido el argumento opcional offset.

Ejemplos

Ejemplo #1 Ejemplo con unpack()

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

El resultado del ejemplo sería:

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

Ejemplo #2 Ejemplo con unpack() y un argumento de repetición

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

El resultado del ejemplo sería:

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

Notas

Precaución

Debe tenerse en cuenta que PHP maneja los valores internamente en forma firmada. Si se desempaqueta un valor que es tan grande como el tamaño utilizado internamente por PHP, el resultado será un número negativo, incluso si se ha desempaquetado con la opción "no firmado".

Precaución

Si no se nombra un elemento, se utilizan los índices numéricos a partir de 1. Tenga en cuenta que si tiene más de un elemento sin nombre, algunos datos se sobrescriben porque la numeración se reinicia a partir de 1 para cada elemento.

Ejemplo #3 Ejemplo con unpack() con claves no nombradas

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

El resultado del ejemplo sería:

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

Observe que el primer valor desde el especificador c es sobrescrito por el primer valor desde el especificador n.

Ver también

  • pack() - Compacta datos en una cadena binaria