0

Usando a função unpack() do PHP

criado por Wellington Costa de Almeida em 21/07/2002 4:39pm
Em Perl também existe uma função unpack(), e alguns iniciantes que já ouviram falar na mesma podem se confundir ou até os veteranos podem dar uma estranhada.

Vamos ao início de tudo:

A função unpack() é usada para extrair os dados binários de uma string e colocá-los em um array associativa. Ela é muito útil para ler registros de comprimentos fixos também. Você está provavelmente dizendo "Está tudo bem. O unpack() parece ser uma função útil, mas parece tão enigmático!" É verdade, mas vale a pena o esforço para entender a usar o unpack(). Considere o exemplo abaixo:

<?php
// read five charecters and assign to $rec["zipcode"];
$rec = unpack ("A5zipcode", $str);

// Same thing with substring
$rec["zipcode"] = substr ($str, 0, 5);
?>

Vamos dar uma olhada no primeiro argumento do unpack(): "A5zipcode". O "A5" especifica que a função deve ler uma string de cinco caracteres (o 5) de espaços preenchidos (o A). Então, se o A5 lê uma string de cinco caracteres de espaços preenchidos, para que serve o "zipcode" no final?

Diferente do Perl, a função unpack() do PHP retorna uma array associativa. Portanto, a parte de zipcode do argumento diz ao interpretador PHP que a string de cinco caracteres de espaço preenchido será referida pelo "zipcode" na array associativa.

Acabamos de analisar um simples exemplo de unpack(), mas que tal o exemplo original que lhe dei? Pode ter parecido muito facil, mas não é! Conceitualmente, o exemplo original não é mais fácil do que o exemplo simples; é apenas um monte de códigos de formatação separados por uma "/".

Então, no exemplo unpack() original, lemos 20 bytes e os designamos para $recs["firstname"], e então lemos mais 20 caracteres e os designamos para $resc["lastname"]. Então, nós lemos mais 40 caracteres e os designamos para $resc["address"], lemos mais dois caracteres e os designamos para $resc["zip"].

O unpack() é realmente útil para ler não somente strings de espaços preenchidos, mais muitas outras coisas. Abaixo segue uma lista de todos os códigos de formatação diferentes que podem ser usados como unpack():

a - string de preenchimento nulo
A - string de espaço preenchido
h - string hexadecimal; primeiro nibble abaixo
H - string hexadecimal; primeiro nibble alto
c - char assinado
C - char não assinado
s - assinado curto (Sempre 16 bits, ordem de bytes da máquina)
S - não assinado curto (Sempre 16 bits, ordem de bytes da máquina)
n - não assinado curto (Sempre 16 bits, ordem de bytes de final Grabde)
v - não assinado curto (Sempre 16 bits, ordem de bytes de final pequeno)
i - integral assinada (tamanho depende da máquina e da ordem de byte)
l - integral não assinada (tamanho depedente da máquina e da ordem de byte)
l - long assinado (Sempre 32 bits, ordem de byte de máquina)
L - long não assinado (Sempre 32 bits, ordem de byte da maquina)
N - long não assinado (Sempre 32 bits, ordem de final grande)
V - long não assinado (Sempre 32 bits, ondem de final pequeno)
f - float (tamanho dependente da máquina e representação)
d - double (tamanho dependente da máquina e representação)
x - byte nulo; você pode usá-lo para saltar caracteres (por exemplo, obter cinco, saltar cinco, obter cinco etc)
x - volta um byte; vc pode usá-lo para saltar caracteres da direita para esquerda (por exemplo, retroceder cinco caracteres)
@ - preenchimento nulo (NULL) para posição absoluta.

E finalmente alguns exemplos:

<?php
$str = "Gumbi and PDOC are smelly"; 
$names = unpack ("A5name1/x5/A4name2", $str); // Ler 5, Pular 5 e Ler 4
// $names['name1'] is Gumbi and $names['name2'] is PDOC
?>

Bom é isso ai, espero que esse artigo seja útil. Informo que é a função é muito compensatória levada em tempo e programação e de execução da CPU!

[]'s galera.

Comentários:

Mostrando 1 - 1 de 1 comentários
Robson Mello disse:
Meu irmão, quando você copiar e colar um texto aqui, pelo menos coloque o comentário em português pra disfarçar. Esse código parece marreta pra matar mosquito.
20/01/2005 8:15am (~19 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)