pack

(PHP 4, PHP 5, PHP 7)

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ódigo Descripción
a cadena rellena de NUL
A cadena rellena de SPACE
h cadena hexadecimal, nibble bajo primero
H cadena hexadecimal, nibble alto primero
csigned char
C carácter sin signo
s short con signo (siempre 16 bits, orden de byte de la máquina)
S short sin signo (siempre 16 bits, orden de byte de la máquina)
n short sin signo (siempre 16 bits, orden de byte big endian)
v short sin signo (siempre 16 bits, orden de byte little endian)
i integer con signo (tamaño y orden de byte dependientes de la máquina)
I integer sin signo (tamaño y orden de byte dependientes de la máquina)
l long con signo (siempre 32 bits, orden de byte de la máquina)
L long sin signo (siempre 32 bits, orden de byte de la máquina)
N long sin signo (siempre 32 bits, orden de byte big endian)
V long sin signo (siempre 32 bits, orden de byte little endian)
q long largo con signo (siempre 64 bit, orden de byte big endian)
Q long largo sin signo (siempre 64 bit, orden de byte big endian)
J long largo sin signo (siempre 64 bit, orden de byte big endian)
P long largo sin signo (siempre 64 bit, orden de byte little endian)
f float (tamaño y representación dependientes de la máquina)
d double (tamaño y representación dependientes de la máquina)
x byte NUL
X copia de seguridad de un byte
Z Cadena 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ón Descripció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*"0x12340x56786566);
?>

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