我正在尝试用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文件系统进行解释,我们将非常感激,在我看来,即使集群分配确保空间局部性,通过引用扇区也会更有效。我不完全了解如何进行字节读取以查找文件/文件夹的下一个群集。
答案 0 :(得分:7)
该伪代码用于从/向文件分配表读取和写入簇号。该文档说它恰好在两段伪代码之间。这是唯一的可能性,除非你对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位值。