FAT1地址字节的开始=4364*512=2234368(记好了)
第四:16地址字节代表FAT表的个数(上表位02)表示有2个FAT表
第五:36——37地址字节代表FAT表占的扇区数(上表为7A07转换0X077A转换成十进制1914扇区)为了方便起见我们把它转换成字节形式:1914*512=979968,与其说FAT表占了1914个扇区不如说FAT表占了979968个字节
第六:有了FAT1的初始字节,FAT表的长度,那么根据FAT32文件系统的结构可知,FAT1表下面是FAT2表
FAT2地址字节=FAT1地址字节+FAT长度=2234368+979968=3214336地址字节
同理FAT2表下面是根目录则:
根目录地址字节= FAT2地址字节+ FAT长度=(3214336+979968)=4194304地址字节
至此BPB的有效数据已经读完了总结如下:
通过上面的对BPB的分析我们知道了原来一个扇区有512个字节,一个簇有4KB(8个扇区),
关键是我们知道了FAT表和根目录的位置如下:
FAT1开始地址字节:2234368
FAT2开始地址字节:3214336
根目录开始地址字节:4194304
下面看看我们找的对不对?
FAT1:
FAT2:
根目录:
这样我们找到了根目录,FAT表后有什么用那?还是没找到文件存哪里啊?接下来该是找得到文件的存储位置的时候了:
第一:我们现在根目录里找到EEE.TXT如图:
这就是了:在对根目录进行解释
第一行45 45 45 20 20 20 20 20:表示EEE(E的ASCII码是45)20表示空格,即不满八位空格补,54 58 54表示TXT即文件类型,
第二行5-6个字符01 00表示此文件开始簇的高位地址
第二行10-11个字符BC 2F表示此文件开始簇低位地址
把这两个字节结合为一个四位:0x00012FBC这就是此文件的开始簇,转换成十进制为77756簇
然后你知道了开始簇你还要到FAT表里找到他,看看他占了几簇!怎么在FAT表里找到他呢?
FAT表里一簇用4个字节表示,数据是从FAT表中第二个簇开始的(也就是第9个字节向后,前8个字节为FAT标志)
所以前两个簇是无用的,要用(77756—2)=77754簇,前面说了一个簇用4字节表示那么我们要找到77754簇的字节地址就要把它分解成字节所以有77754*4字节=311014字节(也就是在FAT表中第311014字节是此文件的FAT对应簇),好了这就找到了?没有还差一步
你要知道FAT1的首地址,好了我知道然后加上311014才是;
所以=FAT1首地址字节+此文件在FAT表中占得字节数=2234368+311014=2545392(此文件的FAT表中的簇)如果这个文件大于一簇那么必定会有下一簇,如果这个文件不到一簇那么这个我们找到的FAT表中应为FF FF FF 0F(结束标志)好了前面我们写入的是ABCDE怎么会大于4KB那?显然我们找到的这个簇一定是FF FF FF 0F
看看是不是:
果然是FF FF FF 0F;
这其实是为超过一簇的文件制作的链表,这个不满一簇所以就结束了,如果满一簇则会在下一个FAT表中给出超出一簇的存处地址,一次类推,这也是FAT表的关键用途;
我们这个继续,既然FAT表中显示我们存储的数据不满一簇我们直接找就行了,根据FAT32结构,可知根目录下是数据区,所以要这样计算存数扇区的首地址字节=根目录+(此文件的簇大小—2【FAT表中的前两个簇是FAT标志,真正的数据从第二簇开始所以要减去】)*一簇的字节数=4194304+(77756-2)*4096=322674688
看看我们写的ABCDE是不是存在这个地址字节下了?
看看吧第一行:41 41 43 44 45 正好是ABCDE的ASCII码
现在我敢说:我在可移动磁盘(H)盘下建立的EEE.TXT文件中的ABCDE被保存在H盘的第322674688/512=630224扇区看看图:
第二行逻辑扇区数:630224
至此找到了,真>他*的麻烦啊