我试图通过读取磁盘映像的十六进制值来找出FAT12软盘文件系统上还有多少剩余可用空间。我的计划是计算值为0x000(空白空间)的FAT条目的数量。我不明白如何将FAT条目转换为可读格式。

我的代码:

#include<stdio.h>
#include<stdlib.h>

   int freeSpace(FILE *fp){
     int fat_entry;

     fseek(fp, 512L, SEEK_SET); //start of first FAT
     fread(&fat_entry,1,3,fp);

     printf("THREE BYTES: %X \n", fat_entry);
     //Finish calculating free space
     return 0;
   }

   int main(int argc, char** argv)
   {
     FILE *fp;
     int free_space;

     if ((fp=fopen(argv[1],"rb")))
    {
      printf("Successfully opened the image file.\n");

      free_space = freeSpace(fp)
      printf("Free Space: %d\n", free_space);
    }
    else
      printf("Fail to open the image file.\n");

    fclose(fp);
    return 0;
  }


在我的十六进制编辑器中,从字节偏移512个字节开始的前三个字节为:FO FF FF

printf("THREE BYTES: %X \n", fat_entry);的输出是:FFFFF0

从大量的规范中,我已经了解到,如果我有3个字节的uv wx yz,则对应的12位FAT12条目将是xuv yzw。所以我想将FFFFF0转换成FF0 FFF的形式,这样我就可以检查任一条目是否为0x000。

关于如何读取正确的FAT12值,我感到非常困惑。我知道它与小的字节序和一些诡计有关,因为我要同时加载2个FAT12值以获得偶数个字节,但是我不知道该从何而来。

最佳答案

以下函数获取下一个群集。该功能来自我的档案。

word nextclust12 (cluster, BPB)
struct BPB *BPB;    // BIOS parameter block
word cluster;       // curent cluster: get next one
{
    word *FAT, index, bytenum, j;
    dword bloknum;

    bytenum= cluster + cluster/2;               /* multiply with 1.5 */
    bloknum= bytenum / (3*512);                 /* in which 3-group is block */
    index=   bytenum % (3*512);                 /* position in 3-group */
                                                /* read part of FAT */
    if (!dosread (FAT_buf, BPB->disk, bloknum + BPB->reserved_bloks, 3))
        return (BADBLOK12);

    FAT= (word *) &FAT_buf[index];      /* get a word from that place */
    if (even (cluster))
        return ( *FAT & 0x0fff);        /* set high 4 bits to zero */
    else
        return ( *FAT >> 4);            /* shift FAT-entry to right */
}


代码不完整(需要大量的标头和其他C文件),因此将其视为伪代码。

10-08 04:12