Pasar un archivo binario a PHP

última actualización el 8 de octubre de 2008, 20:31 por Carlos-vialfa
Publicado por Carlos-vialfa
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

PD: El artículo original fue escrito por kilian, contribuidor de CommentCaMarche
Mejores respuestas para « Pasar un archivo binario a PHP » en :
[PHP] Subir archivos Ver El lenguaje PHP permite administrar los archivos enviados (subidos) gracias a un formulario HTML. Formulario de envío de archivos Configuración de PHP para subir archivos Recuperar el archivo con PHP Formulario de envío de archivos Lo primero...
[Webmaster] Mostrar el código php/xhtml de páginas web Ver Si deseas que los internautas que visitan tu página web puedan ver el código fuente de tus archivos (PHP o HTML), existen varias soluciones. En php Mostrar el código php Mostrar el código html En html Informaciones Ver también En...
Modificar el archivo Hosts Ver¿Para qué debemos modificar el archivo Hosts? ¿Cómo modificar el archivo Hosts? ¿Dónde se encuentra el archivo Hosts original? ¿Qué contiene? Método para modificar el archivo hosts Restaurar el archivo Hosts a su estado original ¿Para...
[Grabar] Grabar o reproducir un archivo .NRG VerUn archivo .NRG es una imagen de disco, es decir una copia binaria de un CD o de un DVD bajo la forma de un archivo. Los archivos .NRG son utilizados por los programas de grabación o por los reproductores de discos virtuales (como Daemon...
[Windows] Archivo o carpeta imposible de eliminar VerSi Windows no consigue eliminar un archivo o una carpeta, la causa puede ser una de las siguientes: El archivo o la carpeta está siendo utilizado por un proceso del sistema La carpeta contiene archivos o carpetas ocultas El archivo o carpeta es...
Descargar PHP Editor VerPHP Editor es una herramienta perfecta para los programadores en lenguaje PHP, además puede ser utilizado para HTML, SQL, Java, JavaScript, C++, Python, etc. Con PHP Editor podrás trabajar con varios documentos al mismo tiempo, éste incorpora un...
Descargar PHP para Linux VerEs un lenguaje de programación para desarrollar páginas web, esta a tu alcance porque es gratuito e incluye el código fuente, es multiplataforma y no tendrás problema porque es muy sencillo y fácil de aprender. PHP trabaja en conjunto con el...
Descargar PHP Nuke VerEs un software completo que te permitirá confeccionar tu pagina web sin que tengas mucho conocimiento de programación en PHP, con él tendrás una pagina web dinámica y en poco tiempo. Incluirás tu área de foros, de noticias, de descargas, encuestas,...
¿Qué es un archivo? Ver¿Qué es un archivo? Un archivo es un conjunto de información binaria; es decir, un conjunto que va de 0 a 1. Este archivo puede almacenarse para mantener un registro de esta información. Un archivo de texto es un archivo que contiene caracteres...