我试图在C中编写一个程序,允许我通过FAT32文件系统映像.但是,我很难理解和应用方程式来收集正确的数据.我正在使用linux的debian发行版,因此维护了little-endian形式.下面是Microsoft网站上关于FAT32的伪代码,计算下一个要访问目录或文件的集群:
ThisFATSecNum = BPB_ResvdSecCnt + (FATOffset / BPB_BytsPerSec); ThisFATEntOffset = REM(FATOffset / BPB_BytsPerSec); FAT32ClusEntryVal = FAT32ClusEntryVal & 0x0FFFFFFF; *((DWORD *) &SecBuff[ThisFATEntOffset]) = (*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0xF0000000; *((DWORD *) &SecBuff[ThisFATEntOffset]) = (*((DWORD *) &SecBuff[ThisFATEntOffset])) | FAT32ClusEntryVal;
我不完全了解SecBuff字符数组正在做什么或它正在访问什么.DWORD应该是一个unsigned int,我不确定我是否理解后续的转换.任何光棚都非常受欢迎.
如果有人也可以解释我们应该如何通过基于集群的FAT32文件系统进行解释,那么我将非常感激,在我看来,即使集群分配确保了空间局部性,通过引用扇区也会更有效.我不完全了解如何进行字节读取以查找文件/文件夹的下一个群集.
该伪代码用于从/向文件分配表读取和写入簇号.该文档说它恰好在两段伪代码之间.这是唯一的可能性,除非你对FAT12/16/32的工作方式一无所知.
------ 8 <------
假设将其读入名为SecBuff的8位字节数组中.还假设WORD类型是16位无符号,并且DWORD类型是32位无符号.
If(FATType == FAT16) FAT16ClusEntryVal = *((WORD *) &SecBuff[ThisFATEntOffset]); Else FAT32ClusEntryVal = (*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0x0FFFFFFF;
获取该群集的内容.要设置此同一群集的内容,请执行以下操作:
If(FATType == FAT16) *((WORD *) &SecBuff[ThisFATEntOffset]) = FAT16ClusEntryVal; Else { FAT32ClusEntryVal = FAT32ClusEntryVal & 0x0FFFFFFF; *((DWORD *) &SecBuff[ThisFATEntOffset]) = (*((DWORD *) &SecBuff[ThisFATEntOffset])) & 0xF0000000; *((DWORD *) &SecBuff[ThisFATEntOffset]) = (*((DWORD *) &SecBuff[ThisFATEntOffset])) | FAT32ClusEntryVal; }
------ 8 <------
以上伪代码操作的单元格中的这些簇编号:
他们说下一个文件部分(如果有的话)在哪个集群中.每个文件或目录都是一个集群链.
SecBuff
是一个包含文件分配表的512字节长扇区的数组.所述*((DWORD *)
铸件在那里,以避免读出/在单独的8位段写入32位值.