Pasar un archivo binario a PHP

Agosto 2017

Supongamos que has guardado datos binarios en un archivo, o sea sin pasar a un formato de texto.
Esto es algo que hacemos frecuentemente con ciertos lenguajes de bajo nivel bajo nivel, como C o Pascal.
Veamos un ejemplo en C, supongamos que queremos guardar el valor 500 en un archivo, el código será:
 #include <stdio.h>

int main()
{
    int val = 500;
    FILE *fp = fopen("archivo", "wb");
    
    fwrite(&val, sizeof(int), 1, fp); //Guarda val en un "archivo"
    fclose(fp);
    return 0;
}

Si luego de haber guardado este archivo, lo abrimos con un editor de texto, veremos algo incomprensible ya que el valor no ha sido guardado en formato texto sino en binario.

Si utilizamos un lenguaje como PHP, puede que en algún momento necesitemos utilizar valores que hemos guardado previamente en binario. Sin embargo PHP lee y escribe únicamente archivos de texto. Por lo tanto será necesario utilizar una función específica para utilizar correctamente nuestros valores.

La solución


La función unpack() es la que nos permitirá resolver este problema.
El primer argumento indicará el tipo de dato que deseamos obtener y el segundo la cadena desde la cual vamos a obtener los datos.

El tipo de dato que deseamos obtener debe ser indicado con un carácter simbólico. Por ejemplo, para obtener un entero con signo (tipo int en C), utilizaremos el carácter "i".

Por lo tanto, en el caso del archivo que hemos guardado en el ejemplo anterior, el código para obtener el valor será:
 <?
$fp = fopen("archivo", "rb");
$data = fread($fp, 4); //4 tamaño en bytes de un entero en una PC 32 bits.
$numero = unpack("i", $data);
echo $numero[1]; //mostrara 500
?>

Importante:
  • El tamaño de los datos puede cambiar dependiendo de la arquitectura del procesador. Un mismo programa escrito en C utilizará enteros de tamaños diferentes si se utiliza una PC 32 bits o una 64 bits. Igualmente, el tamaño podrá ser diferente de una arquitectura de procesador a otro (Sparc, Arm, PowerPc etc...).
  • La disposición de los datos puede que tampoco sea la misma. Algunas máquinas guardan los datos en Big Endian, otros en Little Endian.
  • El tamaño de los datos también puede variar según el compilador.
  • La función unpack devuelve una matriz para permitir un uso un poco más elaborado que la que hemos dado de ejemplo. En nuestro ejemplo, con un solo valor solicitado, nuestro valor es situado en el offset 1 de la matriz.

Equivalencias de formatos / tipos de datos para la arquitectura 32 bits


Los formatos utilizados los podemos ver aquí.
A continuación veremos una pequeña tabla de equivalencias para los datos guardados por un programa en C compilado en una PC 32 bits.
Estas equivalencias dependen del compilador utilizado para compilar el programa, además de otros parámetros que intervienen. Recomiendo probar el programa con valores grandes y pequeños.
Estas equivalencias son dadas como ejemplo, yo no las he probado.

char: c
unsigned char: C
short: s
unsigned short: S
int: l
unsigned int: L
float: f
double: d

Consulta también

Publicado por Carlos-vialfa. Última actualización: 8 de octubre de 2008 a las 20:31 por Carlos-vialfa.
El documento «Pasar un archivo binario a PHP» se encuentra disponible bajo una licencia Creative Commons. Puedes copiarlo o modificarlo libremente. No olvides citar a CCM (es.ccm.net) como tu fuente de información.