FAT32文件系统寻找文件存储扇区 自从我做完12864图像显示后就在想做个视频玩玩,结果视频生成的帧需要大量的储存空间,仅凭那可怜的8KB啥也做不了,于是就开始找一种大容量的存储器!可是用什么呢?EEPROM是肯定不行的,外部扩展也不行,还是信息的力量让我知道了-------SD卡; 其实SD卡我不陌生,以前在日照买的MP4用的是1GB 的SD卡,想到那东西如果可以用的话,那将会对我有质的飞跃,于是我找了一些资料,通过看这些资料我开始知道奥原来SD卡内部是有文件系统的!怪不得电脑能读取他呢!并且这种文件系统在我们的电脑上,手机上,到处是,平时我们只是知道:把一首歌考到MP3播放器里的文件夹里,就可以听了;熟不知这就是文件系统的功劳啊!在文件系统里我看到了FAT32的存在,于是我决定看看到底什么是FAT32文件系统。 开始在看振南写的关于FAT32的资料,不行啊,不懂,后来又在网上找了些资料综合后找出了寻找FAT32文件的路径。 打个比方:现在我在可移动磁盘(H)里建一个文件文件名为EEE.txt,里面写ABCDE五个字符, 然后保存;我要在存储卡里找到这五个字符怎么实现呢? 下面是我找到他的过程: 首先进入DBR中找到BPB 这就是SD卡的0扇区,我们要的是BPB,那BPB在哪里?呵呵在从地址字节0----地址字节59共60字节数据; 当然在这60字节里也有大部分是不必要的,真正有用的是一小部分,那这部分是什么呢? 第一:11——12地址字节的数据代表每扇区字节数(上表中为0002)这里数据时小端(数据地位在地址高位)表示所以要转换成大端(数据地位在地址地位)为0x0200;再转换成十进制为512,原来是这样,也就是这两个字节告诉我们每扇区512个字节;仅此而已! 第二:13地址字节数据代表每簇扇区数(上表位08)表示一个簇有8个扇区,也就是8*512=4096=4KB; 第三:14——15地址字节代表保留扇区数,也就是FAT表是从这里开始的。(上表中为0C11转成0x110C转成十进制4364扇区) 到这里引出第一个关键项 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 至此找到了,真>他*的麻烦啊 |
更多回帖