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

C 从软盘映像读取扇区-位移位?,c,bit-shift,floppy,C,Bit Shift,Floppy,我正在尝试用C语言读取和显示软盘的磁盘几何图形。我能够管理前几个条目(据我所知,至少它们是正确的),例如: 每个扇区的字节数 每个集群的扇区数 为启动记录保留的扇区 脂肪的数量 我的问题是,我一直在试图找出其余几何体的位偏移,这是我被告知要做的,以便正确读取值。我不认为我的代码有问题,但我正在做的是(SECTORSIZE是一个常量512):: void getSector(char*sector,int secNum,FILE*fp) { fseek(fp,(secNum*SECTORSIZ

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

  • 每个扇区的字节数
  • 每个集群的扇区数
  • 为启动记录保留的扇区
  • 脂肪的数量
我的问题是,我一直在试图找出其余几何体的位偏移,这是我被告知要做的,以便正确读取值。我不认为我的代码有问题,但我正在做的是(SECTORSIZE是一个常量512)::

void getSector(char*sector,int secNum,FILE*fp)
{
fseek(fp,(secNum*SECTORSIZE),SEEK\u SET);
fread(扇区,大小(字符),扇区大小,fp);
}
文件*fp;
字符扇区[512];
无符号整数文件大小;
int i;
int-diroffset;
字符名[8];
名称[0]=0;
fp=fopen(“软盘”、“r”);
//扇区0包含磁盘几何体
getSector(扇区,0,fp);

printf(“每个扇区的字节数:%d\n”,((unsigned int)扇区[0x0c])如果我想让代码正确,我假设这是FAT,您正在检查位置0处的
NUL
,否则不要检查。我不是专家,但我认为这不对。尝试使用
unsigned char扇区[512];
以消除强制转换。对于已删除或未使用的条目,文件名的第一个字符也可以是0xE5。包含几乎所有详细信息的有价值信息。您没有以二进制格式打开软盘映像(
“rb”
)@他们这么做并没有改变任何事情,在删除了未签名的int之后,我的IDE又开始抱怨了
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]);
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;
}