作者LPH66 (小心课业闭锁空间...)
看板C_and_CPP
标题Re: [问题] C用fopen, fread读FAT映像档
时间Sun Jun 18 17:09:33 2006
※ 引述《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
1F:推 koalahong:感谢..又学到一课了 06/18 17:28
2F:推 silveran:大推 06/19 13:53
3F:推 roga:推 06/20 22:37
4F:推 darkpoet:帮推 ... 06/20 23:38