gpt4 book ai didi

c - 从 FAT12 查找可用软盘空间

转载 作者:行者123 更新时间:2023-11-30 15:14:41 28 4
gpt4 key购买 nike

我试图通过读取磁盘镜像的十六进制值来计算 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

根据我读过的FAT规范,我的理解是,如果我有3个字节uv wx yz,则相应的12位FAT12条目将是xuv yzw。所以我想将 FFFFF0 转换为 FF0 FFF 形式,这样我就可以检查任一条目是否为 0x000。

我对如何读取正确的 FAT12 值感到非常困惑。我知道这与小字节序和一些技巧有关,因为我同时加载 2 个 FAT12 值以获得偶数个字节,但我不知道从这里到哪里去。

最佳答案

以下函数获取下一个簇。该函数来 self 的存档。

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 文件),因此将其视为伪代码。

关于c - 从 FAT12 查找可用软盘空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33976603/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com