我的CPU是Little Endian,文档告诉我它符合FAT规范的字节顺序。为什么然后我得到第一个扇区的字节0-3的BS_jmpBoot的有效地址,却没有得到第一个扇区的字节BBP_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数组来分配空间,因为我想确保要在任何计算机上写入的空间;还是我不应该?

再次感谢!

最佳答案

您没有正确阅读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

关于c - FAT BPB和小端序反转,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27158708/

10-09 04:41