pack

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

packEmpaqueta información a una cadena binaria

Descripción

pack(string$format, mixed$args = ?, mixed$... = ?): string

Empaqueta los argumentos dados a una cadena binaria según el formato dado por format.

La idea de esta función fue tomada de Perl y todos los códigos de formato funcionan igual que en Perl. Sin embargo, hay algunos códigos de formato que no están, como el código de formato "u" de Perl.

Observe que la distinción entre valores con signo y sin signo sólo afecta a la función unpack(), la función pack() da los mismos resultados para códigos de formato con y sin signo.

Parámetros

format

La cadena format consiste en códigos de formato seguidos de un argumento opcional de repetición. El argumento de repetición puede ser un valor entero o * para repetir hasta el final de los datos de entrada. Para a, A, h, H las repeticiones especifican cuántos caracteres se toman de un argumento de datos, para @ es la posición absoluta donde colocar el dato siguiente, para todo lo demás las repeticiones especifican cuántos argumentos de datos se consumen y empaquetan en la cadena binaria resultante.

Los formatos implementados actualmente son:

Caracteres de formato de pack()
CódigoDescripción
acadena rellena de NUL
Acadena rellena de SPACE
hcadena hexadecimal, nibble bajo primero
Hcadena hexadecimal, nibble alto primero
csigned char
Ccarácter sin signo
sshort con signo (siempre 16 bits, orden de byte de la máquina)
Sshort sin signo (siempre 16 bits, orden de byte de la máquina)
nshort sin signo (siempre 16 bits, orden de byte big endian)
vshort sin signo (siempre 16 bits, orden de byte little endian)
iinteger con signo (tamaño y orden de byte dependientes de la máquina)
Iinteger sin signo (tamaño y orden de byte dependientes de la máquina)
llong con signo (siempre 32 bits, orden de byte de la máquina)
Llong sin signo (siempre 32 bits, orden de byte de la máquina)
Nlong sin signo (siempre 32 bits, orden de byte big endian)
Vlong sin signo (siempre 32 bits, orden de byte little endian)
qlong largo con signo (siempre 64 bit, orden de byte big endian)
Qlong largo sin signo (siempre 64 bit, orden de byte big endian)
Jlong largo sin signo (siempre 64 bit, orden de byte big endian)
Plong largo sin signo (siempre 64 bit, orden de byte little endian)
ffloat (tamaño y representación dependientes de la máquina)
ddouble (tamaño y representación dependientes de la máquina)
xbyte NUL
Xcopia de seguridad de un byte
ZCadena rellena de NUL (nuevo en PHP 5.5)
@relleno de NUL hasta la posición absoluta
args

Valores devueltos

Devuelve una cadena binaria que contiene información.

Historial de cambios

VersiónDescripción
5.6.3 Se añadieron los códigos "q", "Q", "J" y "P" para habilitar el trabajo con número de 64 bit.
5.5.0 Se añadió el código "Z" con funcionalidad equivalente a "a" por compatibilidad con Perl.

Ejemplos

Ejemplo #1 Ejemplo de pack()

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

La cadena binaria resultante será de 6 bytes de longitud y contendrá la secuencia de bytes 0x12, 0x34, 0x78, 0x56, 0x41, 0x42.

Notas

Precaución

Observe que PHP almacena internamente los valores de tipo integer como valores con signo de tamaño dependiente de la máquina (de tipo long de C). Los literales de tipo integer y las operaciones que producen números fuera de los límites del tipo integer serán almacenados como float. Cuando se empaquetan estos floats como integers, primero son convertidos al tipo integer. Esto puede o no puede resultar en el patrón de bytes deseado.

El caso más relevante es cuando se empaquetan números sin signo que serían representables con el tipo integer si fueran sin signo. En sistemas donde el tipo integer tiene un tamaño de 32 bits, la conversión normalmente resultará en el mismo patrón de bytes que si el tipo integer fuera sin signo (aunque esto depende de las conversiones de con signo a sin signo definidas en la implementación, conforme al estándar de C). En sistemas donde el tipo integer tiene un tamaño de 64 bits, el tipo float casi con toda seguridad no tendrá una mantisa suficientemente grande para mantener el valor sin pérdida de precisión. Si esos sistemas también tienen un tipo int de C de 64 bits nativo (al contrario que la mayoría de sistemas basados en UNIX), la única forma de usar el formato de empaquetación I en el rango superior es crear valores integer negativos con la misma representación de bytes que el valor sin signo deseado.

Ver también

  • unpack() - Desempaqueta datos de una cadena binaria
To Top