2013-12-18 4 views
0

В настоящее время я работаю над C-проектом, где я должен скрывать текст в изображении .bmp.Различные значения структуры в Linux и Windows

Поэтому я открываю изображение и написать заголовок файла и информационный заголовок в двух структурах:

typedef struct _BitmapFileHeader_ 
{ 
    uint16_t bfType_; 
    uint32_t bfSize_; 
    uint32_t bfReserved_; 
    uint32_t bfOffBits_; 
} 
__attribute__((packed)) 
BitmapFileHeader; 

typedef struct _BitmapInfoHeader_ 
{ 
    uint32_t biSize_; 
    int32_t biWidth_; 
    int32_t biHeight_; 
    uint16_t biPlanes_; 
    uint16_t biBitCount_; 
    uint32_t biCompression_; 
    uint32_t biSizeImage_; 
    int32_t biXPelsPerMeter_; 
    int32_t biYPelsPerMeter_; 
    uint32_t biClrUsed_; 
    uint32_t biClrImportant_; 
}BitmapInfoHeader; 

BitmapFileHeader* bitmap_headerdata = NULL; 
BitmapInfoHeader* bitmap_infodata = NULL; 

имя файла определено ранее

int readBitmapFile (char* filename, BitmapFileHeader** bitmap_headerdata, 
      BitmapInfoHeader** bitmap_infodata, unsigned char** bitmap_colordata) 
{ 
    FILE* bmp_file; 
    bmp_file = fopen(filename, "rb"); 

    fseek(bmp_file, 0, SEEK_SET); // Set File Cursor to beginning 
    fread((*bitmap_headerdata), sizeof(**bitmap_headerdata), 1, bmp_file); 
    fseek(bmp_file, sizeof(**bitmap_headerdata), SEEK_SET); 
    fread((*bitmap_infodata), sizeof(**bitmap_infodata), 1, bmp_file); 

    int checkinfo = sizeof(**bitmap_infodata); 
    int checkheader = sizeof(**bitmap_headerdata); 
    printf("Size of Infodata: %d\nSize of Headerdata: %d\n", checkinfo, checkheader); 

    .... 
} 

Когда я открываю правильный Bitmap (24bit, не сжатый), и я сравниваю значения bfType_, biBitCount и biCompression с 19778,24,0 на Linux, он работает отлично, но когда я пытаюсь запустить его в Windows, программа останавливается, когда сравнивает biBitCount с 24. Когда я отлаживал программу I заметил, что все Значения из «bitmap_infodata» - это одна строка выше, откуда они должны быть (когда я смотрю на нее как на таблицу). Затем я сравнил sizeof (** bitmap_headerdata) с Linux и Windows и заметил, что это 14 на Linux и 16 на Windows?

Не должно быть одинаковым? И почему структура bitmap_headerdata имеет одинаковые значения для обеих ОС, но bitmap_infodata отличается?

Бернхард

+1

Какой компилятор вы используете на окнах? – nos

+0

Вы предполагаете, что структуры выложены одинаково на разных компиляторах/платформах. –

+1

Вы были разбиты по памяти. Проверка 'sizeof (BitmapFileHeader)' на обеих платформах – Tibo

ответ

1

Проблема заключается в том, что структуры являются проложенный по-разному в различных средах.

Есть 2 решения проблемы.

1: Прочитать поле заголовка по полю.

2: Удалите прокладку. Синтаксис для этого зависит. Некоторые компиляторы используют #PRAGMA PACK. Вы используете __attribute__((__packed__)), который не работает на обеих платформах.

Смежные вопросы