<acronym id='qkkw'><em id='qkkw'></em><td id='qkkw'><div id='qkkw'></div></td></acronym><address id='qkkw'><big id='qkkw'><big id='qkkw'></big><legend id='qkkw'></legend></big></address>
<fieldset id='qkkw'></fieldset>

    1. <i id='qkkw'><div id='qkkw'><ins id='qkkw'></ins></div></i>
    2. <i id='qkkw'></i>

        <span id='qkkw'></span>
      1. <tr id='qkkw'><strong id='qkkw'></strong><small id='qkkw'></small><button id='qkkw'></button><li id='qkkw'><noscript id='qkkw'><big id='qkkw'></big><dt id='qkkw'></dt></noscript></li></tr><ol id='qkkw'><table id='qkkw'><blockquote id='qkkw'><tbody id='qkkw'></tbody></blockquote></table></ol><u id='qkkw'></u><kbd id='qkkw'><kbd id='qkkw'></kbd></kbd>

        <code id='qkkw'><strong id='qkkw'></strong></code>

          <ins id='qkkw'></ins>
        1. <dl id='qkkw'></dl>

        2. 解析FAT16文件系统

          • 时间:
          • 浏览:23
          • 来源:124软件资讯网

          指导扇区的信息如下:




          1. 偏移地址00H  ,长度3  ,内容:EB 3C 90 跳转指令  。


          2. 偏移地址03H  ,长度8  ,内容:4D 53 44 4F 53 35 2E 30 为厂商标志和os 版本号 ,这里是MSDOS5.0  。


          3. 偏移地址0BH,长度2  ,内容:00 02  。注重这里数据的结构  ,高地址放高字节 ,低地址放低字节(数据为小端花样组织)  ,以是数据应该是0200  ,即512  。表现的意思是  ,该磁盘每个扇区有512个字节  。有的可能是1024、2048、4096 。


          4. 偏移地址0DH  ,长度1  ,内容:01 。表现的意思是每个簇有1个扇区 。这个值不能为0 ,而且必须是2的整数次方  ,好比1、2、4、8、16、32、64、128 。可是这个值不能使每个簇凌驾32KB字节  。


          5. 偏移地址0EH  ,长度2 ,内容:08 00  。转换一下 ,就是00 08 ,意思是保留区域中的保留扇区数为8个  。那么就可以知道下面的FAT1区的最先的地址就是:0x08*0x200(每个扇区的字节数)=0x1000 。


          6. 偏移地址10H  ,长度1  ,内容:02  。表现此卷中的FAT结构的份数为2  ,另外一个是备份的  。


          7. 偏移地址11H  ,长度2  ,内容:00 02  。转换一下  ,就是0200H ,表现根目录项数(Root Entries) 能够生存在该分区的根目录文件夹中的32个字节长的文件和文件夹名称项的总数  。在一个典型的硬盘上 ,本字段的值为512 。


          8. 偏移量地址13H  ,长度2 ,内容:4D ED  。转换一下就是ED4DH  ,即约莫32MB的SD卡存储量 。表现小扇区数(Small Sector)  。该分区上的扇区数  ,表现为16位(<65536)  。对大于65536个扇区的分区来说  ,本字段的值为0  ,而使用大扇区数来取代它  。


          9. 偏移地址16H  ,长度2  ,内容:EC 00 。转换一下为00EC  ,表现每个FAT占用的扇区数 。那么每个扇区占用的字节数就是0x00EC*0x200=0x1D800  。凭据启动区、FAT1、FAT2、根目录、数据区的序次 ,可以依次盘算出它们的地址了 。(教程中给出的偏移地址为24H ,可是凭据现实的FAT1/FAT2地址的推算 ,应该是16H地址)


          10. 偏移量地址20H ,长度2  ,内容:00 00  。表现大扇区数(Large Sector)  。若是小扇区数字段的值为0  ,本字段就包罗该FAT16分区中的总扇区数  。若是小扇区数字段的值不为0  ,那么本字段的值为0 。


          11. 偏移量地址36H  ,长度为8 ,内容:46 41 54 31 36 20 20 20 ,对于ASCII码为“FAT16”  ,表现文件系统类型(File System Type) 凭据该磁盘花样  ,该字段的值可以为FAT、FAT12或FAT16


          启动区:天经地义是0x00;


          FAT1:0x1000;


          FAT2:0x1000 + 0x1D800 = 0x1E800;


          根目录区:0x1E800 + 0x1D800 = 0x3C000;


          数据区的地址  ,等等再盘算  。这个只是盘算  ,可以看看是不是和现实的一致 。







          怎么样  ,是不是和盘算的很一致  。


          为什么要盘算SD数据的读取要给出地址 ,而且每次读取都是一个整扇区  ,512个字节  。找出这些地址后 ,可以很利便的找到数据  。


          现在剖析下根目录区的内容:


          这里使用的是FAT16漫笔件目录项 ,每32个字节表现一个文件(文件夹也是)  ,32个字节的表现界说划分如下:





          FAT16目录项32个字节的表现界说


          字节偏移(16进制)


          字节数


          界说


          0x0~0x7


          8


          文件名


          0x8~0xA


          3


          扩展名


          0xB


          1


          属性字节


          00000000(读写)


          00000001(只读)


          00000010(隐藏)


          00000100(系统)


          00001000(卷标)


          00010000(子目录)


          00100000(归档)


          0xC~0x15


          10


          系统保留


          0x16~0x17


          2


          文件的最近修改时间


          0x18~0x19


          2


          文件的最近修他日期


          0x1A~0x1B


          2


          表现文件的首簇号


          0x1C~0x1F


          4


          表现文件的长度



          1. 偏移地址00H  ,长度8  ,内容:驱动器的名称  ,8个字节 。这里的CCD8对应国标码“特”  ,而C8A8对应国标码“权”  ,即特权同砚给该SD卡起的“特权”一名  。


          2. 偏移地址20H  ,长度8  ,内容:54 45 53 54 20 20 20 20  。表现第一个文件名:TEST (空缺部门是空格)  。


          偏移地址80H  ,长度8  ,内容:4E 45 58 54 20 20 20 20  。表现第二个文件名:NEXT (空缺部门是空格)  。


          3. 偏移地址28H(88H也一样)  ,长度3  ,内容:54 58 54 。表现文件类型 ,为ASCII字符表现  。


          4. 偏移地址2BH(8BH也一样)  ,长度1  ,内容:20  。表现文件属性  ,00000000(读写);00000001(只读);00000010(隐藏);00000100(系统);00001000(卷标);00010000(子目录);00100000(归档)  。


          5. 偏移地址36H  ,长度2  ,内容为BA 49  。表现时间=小时*2048+分钟*32+秒/2  。得出的效果换算成16进制填入即可 。也就是:36H字节的0~4位是以2秒为单元的量值;36H字节的5~7位和37H字节的0~2位是分钟;37H字节的3~7位是小时 。


          6. 偏移地址38H  ,长度2  ,内容为A3 3A  。表现日期=(年份-1980)*512+月份*32+日 。得出的效果换算成16进制填入即可  。也就是:38H字节0~4位是日期数;38H字节5~7位和39H字节0位是月份;39H字节的1~7位为年号 ,原界说中0~119划分代表1980~2099  ,现在高版本的Windows允许取0~127 ,即年号最大可以到2107年 。


          7. 偏移地址3AH  ,长度2  ,为该文件最先簇号 ,这里也是用了小端花样组织  。转换下为00 02  ,凭据这个就可以找到文件TEST.txt下一个簇号在FAT1中的位置了  。1000H+02H*02H(由于2个字节存一个簇号)= 1004H  。


          偏移地址3AH  ,长度2  ,为该文件最先簇号 ,这里也是用了小端花样组织  。转换下为00 62  ,凭据这个就可以找到文件NEXT.txt下一个簇号在FAT1中的位置了 。1000H+62H*02H(由于2个字节存一个簇号)= 10C4H 。


          8. 偏移地址3CH  ,长度4  ,内容:59 BE 00 00  。表现文件长度  ,转换后为00 00 BE 59就是48729字节  。


          偏移地址9CH  ,长度4 ,内容:32 00 00 00 。表现文件长度 ,转换后为00 00 00 32就是50字节  。



          TEST.txt占用了48KB的空间 ,NEXT占用了512B的空间  。文件是根据整簇来存放的  ,不够一个簇的巨细(由上面算得  ,一个簇为一个扇区即512B)  ,也要给一个簇的空间 。


          盘算出该文件放置空间  。


          从文件的巨细可以盘算出  ,需要占用几多个簇  。凭据前面的数据  ,每个簇放1个扇区  ,每个扇区512个字节  ,那么一个簇的空间就是512字节了  。那么48729字节需要96个簇  ,这96个簇的最先的地址就可以盘算出来了 。




          首先要提一点  ,这个地方也是特权同砚找了许多资料才发现的  ,就是根目录中根文件夹占有32(20H)个扇区应该是牢固的(至少对于FAT16应该是这样) ,以是真正的用户数据存放应该是从根目录地址的32个扇区偏移量后最先算的  。


          上面已经知道TEST.txt最先簇地址存放在FAT1中的偏移量了:02H  ,由此可以先盘算出TEST.txt的第一簇数据存放地址为:3C000H(根目录地址)+20H*200H(前面提到的用户数据偏移量)+(02H-02H)*01H(1个簇有1个扇区)*200H=40000H 。把偏移量-02H意思是簇号在FAT1中存储都是从02H最先的  。


          而第一个簇地址存放在FAT1中的:1000H(FAT1起始地址)+02H*02H=1004H  。而1004H地址上的数据为:03 00 ,转换后为0003H ,那么我们可以盘算出TEST.txt第二个簇的地址为:3C000H(根目录区地址)+20H*200H(前面提到的用户数据偏移量)+ (03H-02H)*01H(1个簇有1个扇区)*200H=40200(第一个簇最先地址)  。依此类推 ,一直到FAT1中偏移量为C2处泛起了FF FF ,这表现TEST.txt文件存储竣事  ,那么前面的0061H就是文件最后一个簇偏移量  。我们可以由此算一下文件巨细为:(0061H-0002H+0001H(赔偿))=96个簇 ,和现实相符  。


          同样的原理可以算出NEXT.txt文件的存放地址  。首先首先地址偏移量为62H  ,由此可以先盘算出NEXT.txt的第一簇数据存放地址为:3C000H(根目录地址)+20H*200H(前面提到的用户数据偏移量)+(62H-02H)*01H(1个簇有1个扇区)*200H=4C000H  。而第一个簇地址存放在FAT1中的:1000H(FAT1起始地址)+62H*02H=10C4H 。而10C4H地址上的数据为:FF FF,即竣事了  ,也就是说由于NTXT.txt不满一个簇  ,那么只能分配到一个簇的地址空间  。