FAT BPB和小端反转

时间:2014-11-26 20:55:52

标签: c disk endianness fat

我的CPU是小端,文档告诉我符合FAT规范的字节顺序。为什么然后,我得到BS_jmpBoot的有效地址,第一个扇区的字节0-3,但没有获得BPB_BytesPerSec的有效数字,第一个扇区的字节11-12。

116         int fd = open (diskpath, O_RDONLY, S_IROTH);
117 
118         read (fd, BS_jmpBoot, 3);
119         printf("BS_jmpBoot = 0x%02x%02x%02x\n", BS_jmpBoot[0], S_jmpBoot[1], S_jmpBoot[2]);
120 
121         read (fd, OEMName, 8);
122         OEMName[8] = '\0';
123         printf("OEMName = %s\n", OEMName);
124 
125         read (fd, BPB_BytesPerSec, 2);
126         printf("BPB_BytesPerSec = 0x%02x%02x\n",BPB_BytesPerSec[0], BPB_BytesPerSec[1]);

产量

BS_jmpBoot = 0xeb5890                  //valid address, while 0x9058eb would not be
OEMName = MSDOS5.0
BPB_BytesPerSec = 0x0002               //Should be 0x0200

我想弄清楚为什么BS_jmpBoot和OEMName打印有效但BPB_BytesPerSec没有。如果有人能够启发我,我将非常感激。

由于

编辑:感谢大家的帮助,这是我的类型让一切都变得糟糕。我通过将字节写入无符号短文来完成工作,正如uesp建议的那样(有点),但我仍然想知道为什么这不起作用:

            unsigned char BPB_BytesPerSec[2];
...
125         read (fd, BPB_BytesPerSec, 2);
126         printf("BPB_BytesPerSec = 0x%04x\n", *BPB_BytesPerSec);

,得到     BPB_BytesPerSec = 0x0000

我想使用char数组来分配空间,因为我想确定我在任何机器上写的空间;或者我不应该?

再次感谢!

2 个答案:

答案 0 :(得分:3)

您正在错误地阅读BPB_BytesPerSec。 Bpb的结构是(来自here):

BYTE  BS_jmpBoot[3];
BYTE  BS_OEMName[8];
WORD  BPB_BytesPerSec;
...

前两个字段是字节,因此它们的字节序是无关紧要的(我认为)。 BPB_BytesPerSec是一个WORD(假定为2个字节),因此您应该像以下一样定义/读取它:

WORD BPB_BytesPerSec;            //Assuming WORD is defined on your system
read (fd, &BPB_BytesPerSec, 2);
printf("BPB_BytesPerSec = 0x%04x\n", BPB_BytesPerSec); 

因为当您直接读取字节时,得到00 02,即小端的0x0200,您应该正确读取BPB_BytesPerSec这样的内容。

答案 1 :(得分:2)

首先,这一行:

printf("BPB_BytesPerSec = 0x%02x%02x\n",BPB_BytesPerSec[0], BPB_BytesPerSec[1]);

以big endian格式打印出值。如果它在此处打印0x0002,则实际值将为小端的0x0200

至于BS_jmpBoot值,根据this site

  

前三个字节EB 3C和90反汇编到JMP SHORT 3C NOP。 (3C值可能不同。)原因是跳过磁盘格式信息(BPB和EBPB)。由于磁盘的第一个扇区被加载到位于0x0000:0x7c00的ram并执行,没有这个跳转,处理器将尝试执行不是代码的数据。

换句话说,前3个字节是操作码,它们是三个独立的字节,而不是一个小的字节序值。