从软盘图像读取扇区-位移?

时间:2020-02-23 18:42:38

标签: c bit-shift floppy

我试图用C语言读取和显示软盘的磁盘几何形状。我能够管理前几个条目(据我所知至少是正确的),例如:

  • 每个扇区的字节数
  • 每个群集的部门
  • 为引导记录保留的扇区
  • FATS数量

我的问题是我被困在试图找出其余几何图形的位移,这是我被告知要做的,以便正确读取值。我不认为这是我的代码有问题,但是这就是我正在做的事情(SECTORSIZE是const 512):

void getSector(char *sector, int secNum, FILE *fp) 
{
   fseek(fp, (secNum*SECTORSIZE), SEEK_SET);
   fread(sector, sizeof(char), SECTORSIZE, fp);
}

FILE *fp;
char sector[512];
unsigned int fileSize;
int i;
int diroffset;
char name[8];
name[0] = 0;

fp = fopen("floppy", "r");

//sector 0 contains the disk geometry
getSector(sector, 0, fp);

printf("Bytes per Sector: %d\n", (((unsigned int)sector[0x0c]) << 8u) | (unsigned int)sector[11]);
printf("Sectors per Cluster: %d\n", ((unsigned int)sector[0x0d] ));
printf("Reserved Sectors for the Boot Record: %d\n", (((unsigned int)sector[0x0f]) << 8u) | (unsigned int)sector[0x0e]);
printf("Number of FATS: %d\n", ((unsigned int)sector[0x10]));
//printf("Max # of Root Directory Entries: %d\n", (((unsigned int)sector[0x12]) << 8u) | (unsigned int)sector[0x11]);
//printf("Number of Sectors: %d\n", (((unsigned int)sector[12])) | (unsigned int)sector[11]);
//printf("Sectors per FAT: %d\n", ((unsigned int)sector[13] << 8u));
//printf("Sectors per Track: %d\n", (((unsigned int)sector[12]) << 8u) | (unsigned int)sector[11]);
//printf("Number of Surfaces: %d\n", (((unsigned int)sector[12]) << 8u) | (unsigned int)sector[11]);

注释掉的部分是我仍在处理的部分。我几乎只是复制了第一行,只是更改了字符串名称以使其匹配。 FATS数目之后的下一个是根目录的最大数目,这是我遇到麻烦的地方。我有每个几何位置的十六进制表示形式的列表,但是移位却让我不满意。

但是,我还注意到,当我显示文件名时,我显示的是随机字符的额外名称。以下是我查找文件名的方法:

diroffset = 0;

while(diroffset <= 512) {

    getSector(sector, 19, fp);
    // print name of the file
    if((void *) sector[0] != NULL)
        for(i = 0; i < 8; i++)
            name[i] = sector[diroffset + i];

    if(name[0] != 0) {
        printf("Filename: ");
        for(i = 0; i < 8; i++)
            printf("%c", name[i]);
        putchar('\n');
    }

    name[0] = 0;

    diroffset += 32;
}

据我了解,每32个文件中就有一个新文件名,据我所知,除了将这些字符显示为找到的最后一个文件外,它都有效:

  • 文件名:É·╬影院

我想进一步澄清一般的移位,例如何时何地移位。我试图遵循提供给我的示例,但是也许我只是在使某些事情复杂化而没有看到它。

PS:如果您好奇为什么我有这么多unsigned int,那是因为在使用位运算符时,我的IDE会抱怨否则

0 个答案:

没有答案