Чтение секторов с образа дискеты - сдвиг битов? - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь прочитать и отобразить геометрию диска на дискете в 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 - это максимальное количество каталогов root, из-за которого у меня возникают проблемы. У меня есть список шестнадцатеричного представления для каждого местоположения геометрии, но сдвиг битов - это то, что меня отталкивает.

Однако я также заметил, что когда я отображаю имена файлов, я отображаю дополнительное имя случайных символов. Ниже показано, как я нахожу имена файлов:

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: Если вам любопытно, почему у меня так много неподписанных int, то это потому, что моя IDE жалуется иначе при использовании битовых операторов

...