(PHP 4, PHP 5)
pack — Empaqueta información a una cadena binaria
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.
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:
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 |
c | signed 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) |
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
Devuelve una cadena binaria que contiene información.
Versión | Descripción |
---|---|
5.5.0 | Se añadió el código "Z" con funcionalidad equivalente a "a" por compatibilidad con Perl. |
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.
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.