Re: [問題] C用fopen, fread讀FAT映像檔

看板C_and_CPP (C/C++)作者 (小心課業閉鎖空間...)時間18年前 (2006/06/18 16:54), 編輯推噓4(400)
留言4則, 4人參與, 最新討論串1/1
※ 引述《koalahong ()》之銘言: : 我定義了一個structure : 內容大概是 : typedef sturct{ : INT8U jump[3]; : INT8U oem_id[8]; : INT16U bytes_per_sector; : .... : }fat_bootsector; : 用了FILE *img = fopen("ram.img", "rb+");開檔 : 讀檔我寫fread(&bootsector, sizeof(fat_bootsector), 1, img); : 映像檔開頭如下 : 0 1 2 3 4 5 6 7 8 9 a b c d e f : E9 00 00 20 20 20 20 20 20 20 20 00 02 01 01 00 : 照理來說 bytes_per_sector的值應該是 0x0200 : 可是讀出來的結果卻變成 0x0102 : 也就是b的值0x00被跳過了 : 有版友知道要怎麼解決嗎? : 還是說真的得一個field一個field慢慢讀 : 或者是compiler的問題? : 我用的是VC++ 6.0 service pack 5 alignment問題。 你可以把oem_id印出來看 會看到被跳過的00出現在裡面 oem_id會變成 20 20 20 20 20 20 20 00 原因是這樣: ←這樣是4個byte→ ┌─┬─┬─┬─┐通常VC的預設alignment是4 byte, │ │ │ │ │ ├─┼─┼─┼─┤也就是說如果把左圖看成記憶體 (由上而下由左而右) │ │ │ │ │ ├─┼─┼─┼─┤那每個變數就會對齊最左邊來排列 │ │ │ │ │ ├─┼─┼─┼─┤ ┌─────┬─┐ ┌─────┬─┐ ┌─┬─┬─┬─┐ │ jump[3] │X│ │ jump[3] │ │ │E9│00│00│20│ ├─────┴─┤ ├─────┘ │ ├─┼─┼─┼─┤ │ │ │ │ │20│20│20│20│ │ oem_id[8] │ │ oem_id[8]┌─┘ ├─┼─┼─┼─┤ │ │ │ │bytes_... │20│20│20│00│ ├───┬─┬─┤ └─┬─┬─┼─┐ ├─┼─┼─┼─┤ │byte..│..│..│ │..│..│..│ │02│01│01│00│ ├─┬─┼─┼─┤ ┌─┼─┼─┼─┤ ├─┼─┼─┼─┤ 所以上面的宣告就會變成上左圖這樣排 但其實你要的是上中圖的排法 上左圖打X的就是被跳過的byte 對照上右圖的資料 就會知道0x0102是怎麼跑進去的了 既然你是在VC 那下面是VC的解法: #pragma pack(1) 寫在單獨一行 讓VC以1 byte為對齊單位去排 就會排成上中圖的形式了 -- **** 說: 不要期望一個精神力差不多已經見底的人阿Orz -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.240.54

06/18 17:28, , 1F
感謝..又學到一課了
06/18 17:28, 1F

06/19 13:53, , 2F
大推
06/19 13:53, 2F

06/20 22:37, , 3F
06/20 22:37, 3F

06/20 23:38, , 4F
幫推 ...
06/20 23:38, 4F
文章代碼(AID): #14bHIeJ4 (C_and_CPP)
文章代碼(AID): #14bHIeJ4 (C_and_CPP)