【发布时间】:2016-06-12 21:35:25
【问题描述】:
我正在尝试将位图 (.bmp) 图像标题读入 c 中的 struct。
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef struct _BITMAPFILEHEADER {
WORD Type;
DWORD Size;
WORD Reserved1;
WORD Reserved2;
DWORD OffBits;
} BITMAPFILEHEADER;
我读取位图文件的代码
FILE *fp;
BITMAPFILEHEADER header;
fp = fopen(file,"rb");
if (fp == NULL) {
printf("cannot open file!\n");
return 1;
}
fread(&header, sizeof(BITMAPFILEHEADER), 1, fp);
printf("Type: %02x\n", header.Type);
printf("Size: %04x\n", header.Size);
printf("Reserved: %02x\n", header.Reserved1);
printf("Reserved: %02x\n", header.Reserved2);
printf("Offset: %04x\n", header.OffBits);
一切都应该相等:
类型:0x424d
尺寸:0x00060436
保留1:0x00
保留2:0x00
偏移量:0x00000436
实际发生了什么(printf 输出):
类型:0x424d
尺寸:0x0006
保留:0x002
保留:0x436
偏移量:0x280000
(如果有帮助,我的操作系统是 32 位 ubuntu)
【问题讨论】:
-
如果您需要固定宽度的整数,请使用标准提供的整数。不要使用自制类型。另请阅读 abolut
struct布局以及如何正确(反)序列化/编组八位字节流。 -
数据是如何写入文件的?您需要模仿读取数据时的写入方式。如果结构有填充(几乎可以肯定)但数据是零散写入的(好像没有填充——几乎可以肯定是这样),那么数据就不能像你那样被读取。您需要在单独的
fread()操作中依次读取每个元素 - 在使用您认为返回的内容之前,您应该检查每个fread()是否成功。 -
这将有助于显示文件的内容。我从您的输出中猜测该文件实际上是从
4D 42 36 04 06 00 00 00 -
标准位图头文件需要“打包”。