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

Pun*_*oni 3 c file-io binaryfiles bitmap

我正在尝试使用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;
Run Code Online (Sandbox Code Playgroud)

在我的程序中,我这样做.

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);
}
Run Code Online (Sandbox Code Playgroud)

所以,当我读取我的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位)的倍数,它是否会自动更改结构?

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

Car*_*rum 8

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

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

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