pack

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

packEmpacota dados em uma string binária

Descrição

pack(string$format, mixed...$values): string

Empacota os argumentos fornecidos em uma string binária de acordo com o formato especificado em format.

A ideia para esta função foi tirada do Perl e todos os códigos de formatação funcionam da mesma forma que no Perl. Entretando, há alguns códigos de formatação que não existem, como código "u" do Perl.

Observe que a distinção entre valores com e sem sinal somente afeta a função unpack(), enquanto que a função pack() fornece o mesmo resultado para códigos de formato com e sem sinal.

Parâmetros

format

A string format consistem em códigos de formado seguidos de um argumento repetidor opcional. O arrgumento repetidor pode ser um valor inteiro ou * para repetir até o final dos dados de entrada. Para a, A, h, H a contagem de repetição especifica quantos caractares de um argumento de dados são tomados, para @ é a posição absoluta onde colocar o próximo dado, para todo o restante a contagem de repetição especifica quantos argumentos de dados são consumidos e empacotados na string binária resultante.

Os formatos atualmente implementados são:

Caracteres de formato de pack()
CódigoDescrição
aString com bytes NUL à esquerda
AString com espaços à esquerda
hString hexadecimal, nibble menos significativo primeiro
HString hexadecimal, nibble mais significativo primeiro
csigned char
Cunsigned char
ssigned short (sempre 16 bits, ordem de bytes da máquina)
Sunsigned short (sempre 16 bits, ordem de bytes da máquina)
nunsigned short (sempre 16 bits, ordem de bytes Big Endian)
vunsigned short (sempre 16 bits, ordem de bytes Little Endian)
isigned integer (tamanho e ordem de bytes dependentes da máquina)
Iunsigned integer (tamanho e ordem de bytes dependentes da máquina)
lsigned long (sempre 32 bits, ordem de bytes da máquina)
Lunsigned long (sempre 32 bits, ordem de bytes da máquina)
Nunsigned long (sempre 32 bits, ordem de bytes Big Endian)
Vunsigned long (sempre 32 bits, ordem de bytes Little Endian)
qsigned long long (sempre 64 bits, ordem de bytes da máquina)
Qunsigned long long (sempre 64 bits, ordem de bytes da máquina)
Junsigned long long (sempre 64 bits, ordem de bytes Big Endian)
Punsigned long long (sempre 64 bits, ordem de bytes Little Endian)
ffloat (representação e tamanho dependentes da máquina)
gfloat (tamanho dependente da máquina, ordem de bytes Little Endian)
Gfloat (tamanho dependente da máquina, ordem de bytes Big Endian)
ddouble (representação e tamanho dependentes da máquina)
edouble (tamanho dependente da máquina, ordem de bytes Little Endian)
Edouble (tamanho dependente da máquina, ordem de bytes Big Endian)
xbyte NUL
XVolta um byte
ZString com bytes NUL à esquerda
@Preenche com bytes NUL até a posição absoluta
values

Valor Retornado

Retorna uma string binária contendo dados.

Registro de Alterações

VersãoDescrição
8.0.0 Esta função não mais retorna false em caso de falha.
7.2.0 Tipos float e double suportam tanto Big Endian quanto Little Endian.
7.0.15,7.1.1 Os códigos "e", "E", "g" e "G" foram adicionados para habilitar suporte a ordem de byte para float e double.

Exemplos

Exemplo #1 Exemplo de pack()

<?php
$binarydata
= pack("nvc*", 0x1234, 0x5678, 65, 66);
?>

A string binária resultante terá 6 bytes de comprimento e conterá a sequência de bytes 0x12, 0x34, 0x78, 0x56, 0x41, 0x42.

Notas

Cuidado

Observe que internamente o PHP armazena valores int como valores com sinal de tamanho dependente da máquina (o tipo long da linaguagem C). Literais inteiros e operações que resultam em números fora da faixa do tipo int serão armazenados como float. Ao empacotar estes floats como inteiros, eles primeiro são convertidos para o tipo inteiro. Isto pode ou não resultar no padrão de bytes desejado.

O caso mais relevante ocorre ao empacotar números sem sinal que poderiam ser representáveis pelo tipo int se eles fossem sem sinal. Em sistemas onde o tipo int tem 32 bits, a conversão normalmente resulta no mesmo padrão de byte como se o int fosse sem sinal (embora isso dependa das conversões de sem sinal para com sinal definidas pela implementação, conforme o padrão C). Em sistemas onte o tipo int tem 64 bits, o tipo float provavelmente não terá a mantissa grande o suficiente para representar o valor sem perda de precisão. Se estes sistemas também tiverem o tipo int nativo de 64 bits (a maioria dos sistemas tipo UNIX não têm), a única maneira de usar o formato I de empacotamento na faixa superior é criar valores negativos int com a mesma representação de bytes do valor sem sinal desejado.

Veja Também

  • unpack() - Desempacota dados de uma string binária
To Top