我正在尝试在 C 中读取和显示软盘的磁盘几何形状。我能够管理前几个条目(据我所知至少它们是正确的),例如:
- 每个扇区的字节数
- 每个集群的扇区
- 引导记录的保留扇区
- 海外关联公司数量
我的问题是我一直试图找出其余几何形状的位移,这是我被告知要正确读取值的方法。我不相信我的代码有问题,但这就是我正在做的事情(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 在使用位运算符时会报错