Re: [問題] C用fopen, fread讀FAT映像檔
※ 引述《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
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章