(PHP 4, PHP 5, PHP 7, PHP 8)
unpack — Desempacota dados de uma string binária
Desempacota uma srting binária em um array de acordo com o formato especificado em
format.
Os dados desempacotados são armazenados em um array associativo. Para que isto seja feito, os diferentes códigos de formato devem ser nomeados e separados por uma barra /. Se um argumento repetidor estiver presente, cada chave do array terá um número de sequência atrás do nome fornecido.
Form feitas alterações para que esta função ficasse alinhada com a linguagem Perl:
formatConsulte a página da função pack() para uma explicação sobre os códigos de formatos.
stringOs dados empacotados.
offsetO deslocamento na string a partir de onde os dados serão desempacotados.
Retorna um array associativo contendo elementos desempacotados da string
binária, ou false em caso de falha.
| Versão | Descrição |
|---|---|
| 7.2.0 | Tipos float e double suportam Big Endian e Little Endian. |
| 7.1.0 |
O parâmetro opcional offset foi adicionado.
|
Exemplo #1 Exemplo de unpack()
<?php
$binarydata = "\x04\x00\xa0\x00";
$array = unpack("cchars/nint", $binarydata);
print_r($array);
?>O exemplo acima produzirá:
Array
(
[chars] => 4
[int] => 160
)
Exemplo #2 Exemplo de unpack() com um repetidor
<?php
$binarydata = "\x04\x00\xa0\x00";
$array = unpack("c2chars/nint", $binarydata);
print_r($array);
?>O exemplo acima produzirá:
Array
(
[chars1] => 4
[chars2] => 0
[int] => 40960
)
Observe que internamente o PHP armazena com sinal os valores inteiros. Se um inteiro grande longo sem sinal for desempacotado, e for do mesmo tamanho que os valores armazenados internamente pelo PHP, o resultado será um número negativo mesmo que tenha sido especificado um desempacotamento sem sinal.
Se um elemento não for nomeado, seão usados índices numéricos iniciando em 1.
Fique ciente que se houver mais de um elemento sem nome, alguns dados serão
sobrescritos porque a numeração reiniciará a partir de 1 para cada elemento.
Exemplo #3 Exemplo de unpack() com chaves sem nome
<?php
$binarydata = "\x32\x42\x00\xa0";
$array = unpack("c2/n", $binarydata);
var_dump($array);
?>O exemplo acima produzirá:
array(2) {
[1]=>
int(160)
[2]=>
int(66)
}
Observe que o primeiro
valor especificado por c foi
sobrescrito pelo primeiro valor de n
especificado.