看板 C_and_CPP 關於我們 聯絡資訊
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 ============================================================================== 請問有什麼方法可以解決呢? 之前有板友推文說
feefee:#pragma pack() 可以解決你的問題
我試過了,還是不可以....>"< 我是用 VC 不是 gcc 所以也不能用板友說的 在結構宣告後面加 __attribute__((__packed__)) 請問,還有什麼方法可以解決呢?除了一個欄位一個欄位讀。 謝謝大家! :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.163.161.135
renderer:分兩次讀 Check_Mark一次 其他的一次 61.228.216.130 07/05
leeya:一次讀54個字元陣列,再去取你要的值= =" 211.75.159.136 07/05
renderer:fread(&bmp.Check_Mark, 2, 1, fp); 61.228.216.130 07/05
renderer:fread(&bmp.File_Size, 52, 1, fp); 61.228.216.130 07/05
jeunder:應該是 #pragma pack(1) 才對 61.230.216.96 07/05
jeunder:在你宣告 struct 之前使用 61.230.216.96 07/05
qazq:喔喔喔!#pragma pack(1) 成功了!!謝謝!^_^218.163.161.135 07/05