当读取此类文件时,我认为一个好的方法是首先将它们作为字节流读取(unsigned char
),然后,如果需要,根据正确的数据类型解释部分文件内容。
例如,在你的情况下,我会定义BITMAPFILEHEADER
像这样的结构:
typedef struct _BITMAPFILEHEADER {
unsigned char Type[ 2 ];
unsigned int Size; // Size of the BMP file in bytes
unsigned char Reserved1[ 2 ];
unsigned char Reserved2[ 2 ];
unsigned int OffBits; // Starting address of the pixel array
} BITMAPFILEHEADER;
然后,我将读取标头内容作为 14 字节的块,最后,我将继续填充BITMAPFILEHEADER
结构正确。
下面您可以找到一个简单的程序,它读取 BMP 文件的标头并将其打印到屏幕上。
int main
(
)
{
// Defines a few variables
FILE* fp = 0;
unsigned char h[ 14 ];
// Opens the BMP file
fp = fopen( "img.bmp", "rb" );
if ( fp == NULL )
{
printf( "Cannot open file\n" );
return -1;
}
// Reads the BMP header (14 bytes)
fread( h, 14, 1, fp );
// Prints the header contents
printf( "Type: %02x%02x\n", h[ 0 ], h[ 1 ] );
printf( "Size: %02x%02x%02x%02x\n", h[ 2 ], h[ 3 ], h[ 4 ], h[ 5 ] );
printf( "Reserved: %02x%02x\n", h[ 6 ], h[ 7 ] );
printf( "Reserved: %02x%02x\n", h[ 8 ], h[ 9 ] );
printf( "Offset: %02x%02x%02x%02x\n", h[ 10 ], h[ 11 ], h[ 12 ], h[ 13 ] );
return 0;
}
注 1 - 填充:从 BMP 文件格式规范中,我们知道文件头的长度为 14 个字节,而printf( "%d", sizeof(BITMAPFILEHEADER) )
由于填充,将显示不同的(更大!)数字(请参阅对您的问题的评论)。
注 2 - 字节顺序:当分别将 2 或 4 个字节写入短字节或长字节时,必须考虑字节序。这意味着您必须知道如何将值写入文件(对于位图标头,它们使用小端表示法表示)以及您的机器如何处理它们(可能以小端表示法)。