在C中写入位图文件头的问题

我正在尝试使用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个字节(stuct的大小),值应该是

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文件已损坏。

我的问题是,在二进制文件I / O中,如果我将结构写入文件并且其大小不是4Bytes(32位)的倍数,它是否会自动更改结构?

知道怎么解决这个问题吗?

你的结构正在填充。 04 08是堆栈中的垃圾值。 您需要使用编译器提供的任何function来打包结构。 在大多数情况下,您应该能够使用#pragma pack(1)

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

您可以阅读维基百科上的数据结构填充 。