我的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/