作者qazq (...)
看板C_and_CPP
标题[问题] 读取 bmp 的表头。
时间Tue Jul 5 19:58:49 2005
struct BMP_HEADER // BMP档档头
{
short Check_Mark; /* 固定为'BM' */
long File_Size; /* 影像档大小 */
long Reserved; /* 保留 */
long Image_Offset; /* 影像资料在档案中的位置 */
long Header_Size; /* 档头大小,固定40表MS-Windows,12表OS/2 */
long Image_DX; /* 影像宽度 */
long Image_DY; /* 影像高度 */
short Bit_Planes; /* 色彩平面数,固定为1 */
short Bit_Count; /* 每点位元数, 1=黑白, 4=16色, 8=256色, 24=全彩 */
long Compression; /* 压缩方式, 0=不压缩, 1=RLE8(256色), 2=RLE4(16色) */
long Image_Size; /* 影像资料大小 */
long XDPM; /* 水平解析度(每公尺) */
long YDPM; /* 垂直解析度(每公尺) */
long Color_Used; /* 实际使用的颜色数,0表由Bit_Count决定 */
long Color_Important; /* 重要的色彩数目,0表都重要 */
};
用手算的结果,这个结构的大小为 54
但是因为编译器会对记忆体配置最佳化,所以 sizeof() 会变成 56
这样,问题就来了....
当我 fread(&bmp, sizeof(BMP_HEADER), 1, fp);
印出来的结果是错误的。
==============================================================================
Check_Mark(固定为'BM'): 19778
File_Size(影像档大小): 10
Reserved(保留): 3538944
Image_Offset(影像资料在档案中的位置): 2621440
==============================================================================
如果一个一个读...
fread(&bmp.Check_Mark, 2, 1, fp);
fread(&bmp.File_Size, 4, 1, fp);
fread(&bmp.Reserved, 4, 1, fp);
fread(&bmp.Image_Offset, 4, 1, fp);
结果就是正确的....
==============================================================================
Check_Mark(固定为'BM'): 19778
File_Size(影像档大小): 720054
Reserved(保留): 0
Image_Offset(影像资料在档案中的位置): 54
==============================================================================
请问有什麽方法可以解决呢?
之前有板友推文说
1F:推 feefee:#pragma pack() 可以解决你的问题
我试过了,还是不可以....>"<
我是用 VC 不是 gcc 所以也不能用板友说的 在结构宣告後面加
__attribute__((__packed__))
请问,还有什麽方法可以解决呢?除了一个栏位一个栏位读。
谢谢大家! :)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.163.161.135
2F:推 renderer:分两次读 Check_Mark一次 其他的一次 61.228.216.130 07/05
3F:推 leeya:一次读54个字元阵列,再去取你要的值= =" 211.75.159.136 07/05
4F:推 renderer:fread(&bmp.Check_Mark, 2, 1, fp); 61.228.216.130 07/05
5F:→ renderer:fread(&bmp.File_Size, 52, 1, fp); 61.228.216.130 07/05
6F:推 jeunder:应该是 #pragma pack(1) 才对 61.230.216.96 07/05
7F:→ jeunder:在你宣告 struct 之前使用 61.230.216.96 07/05
8F:推 qazq:喔喔喔!#pragma pack(1) 成功了!!谢谢!^_^218.163.161.135 07/05