проблема записи заголовка растрового файла в C - PullRequest
3 голосов
/ 10 сентября 2010

Я пытаюсь создать новый файл растрового изображения, используя C. Это структура заголовка файла .bmp.

#define uint16 unsigned short
#define uint32 unsigned long
#define uint8  unsigned char
typedef struct 
{
 uint16 magic;  //specifies the file type "BM" 0x424d
 uint32 bfSize;  //specifies the size in bytes of the bitmap file
 uint16 bfReserved1;  //reserved; must be 0
 uint16 bfReserved2;  //reserved; must be 0
 uint32 bOffBits;  
} BITMAPFILEHEADER;

В моей программе я делаю это.

main() {
FILE* fp;
fp = fopen("test.bmp", "wb");
 BITMAPFILEHEADER bmfh;
 BITMAPINFOHEADER bmih;

 bmfh.magic = 0x4d42; // "BM" magic word
 bmfh.bfSize = 70; 
 bmfh.bfReserved1 = 0;  
 bmfh.bfReserved2 = 0; 
 bmfh.bOffBits = 54; 
fwrite(&bmfh, sizeof(BITMAPFILEHEADER), 1, fp);
fclose(fp);
}

Итак, когда я читаю мой файл test.bmp, он должен содержать 14 байтов (размер структуры) и значения должны быть

42 4d 46 00 00 00 00 00 00 00 36 00 00 00

Но если я читаю файл, он показывает мне 16 байтов:

42 4d 04 08 46 00 00 00 00 00 00 00 36 00 00 00

Откуда это «04 08»?Мой bmp-файл поврежден.

Мой вопрос заключается в том, что при вводе-выводе двоичного файла, если я записываю структуру в файл, а его размер не кратен 4 байтам (32 бита), он автоматически меняет структуру?

Есть идеи, как обойти это?

1 Ответ

8 голосов
/ 10 сентября 2010

Ваша структура дополняется. 04 08 является значением мусора из вашего стека. Вам нужно использовать любую функцию, которую предоставляет ваш компилятор для упаковки структуры. В большинстве случаев вы должны иметь возможность использовать #pragma pack(1):

#pragma pack(1)  // ensure structure is packed
typedef struct 
{
   .
   .
   .
} BITMAPFILEHEADER;
#pragma pack(0)  // restore normal structure packing rules

Вы можете прочитать о заполнении структуры данных в Википедии.

...