2

我正在尝试用 C 语言编写一个程序,该程序允许我在 FAT32 文件系统映像中移动。但是,我很难理解和应用方程式来收集正确的数据。我正在使用 linux 的 debian 发行版,因此保留了 little-endian 形式。下面是来自微软网站的关于 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 应该是一个无符号整数,我也不确定我是否理解后续的强制转换。任何灯棚都非常感谢。

如果有人还可以解释我们应该如何基于集群移动通过 FAT32 文件系统,那将不胜感激,在我看来,即使集群分配确保了空间局部性,通过引用扇区更有效。我不完全了解如何进行字节读取以找到文件/文件夹的下一个集群。

4

1 回答 1

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 位值。

于 2011-12-12T05:03:25.067 回答