[C con Clase] leer bmp

Salvador Pozo salvador en conclase.net
Jue Nov 5 12:26:31 CET 2009


El pasado 2009-10-30 21:20:18, Lester Oropesa Morales escribió:
 
Hola:
 
LOM> tengo un problema para leer un archivo BMP de 24 bits lo que tengo es lo siguiente:
LOM> #include <fstream>
LOM> #include <stdio.h>
LOM> #include <stdlib.h>
LOM> #include <iostream>
LOM> using namespace std;
LOM> 
LOM> typedef struct cabecera{
LOM>  char ident[2];
LOM>  unsigned long int tam;
LOM>  char reservado[4];
LOM>  unsigned long int offset;
LOM> }cabecera;
LOM> ...
LOM> Mi pregunta es existe algun problema cuando leo una estructura o cuando leo datos primitivos

Esta pregunta es interesante, me ha hecho pensar un buen rato... :-)

La respuesta es que sí, que hay un problema, y afortunadamente, también hay una solución.

El problema es que el compilador usa alineación de bytes para almacenar la estructura. En mi caso, y supongo que también en el tuyo, se usa una alienación de 4 bytes, de modo que entre el campo ident y tam se insertan, de forma automática, dos bytes a los que no tenemos acceso.

Estos dos bytes son los que desordenan el resto de los campos de la estructura.

Por eso la lectura funciona bien cuando lees campo a campo, pero fracasa cuando se lee una estructura.

La solución es simple, hay que indicar al compilador que en el caso de esta estructura use una alineamiento de bytes de 1. Eso se hace mediante la directiva del preprocesador #pragma_pack. En tu caso:

 #pragma_pack(1)
 typedef struct cabecera{
  char ident[2];
  unsigned long int tam;
  char reservado[4];
  unsigned long int offset;
 }cabecera;
#pragma_pack(0)

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase