FAT16文件系统解析(C#版本)

public   class  DiskBase
{
    
...        

    
//系统引导记录(兼容FAT16和FAT32)

    
//文件系统判断(采用微软的判断方法)        
    public static byte IsType(byte[] bytData)
    
{
        
//不是合法BPB扇区数据
        if (bytData[510!= 0x55 || bytData[511!= 0xaareturn 0;

        
//跳转指令不合法
        if (bytData[0!= 0xeb && bytData[0!= 0xe9return 0;

        
//每扇区包含的字节数(一般为512个字节)
        UInt16 BPB_BytsPerSec = (UInt16)(bytData[12<< 8 | bytData[11]);

        
//仅处理512个字节的扇区
        if (BPB_BytsPerSec != 512return 0;

        
//每簇扇区数
        byte BPB_SecPerClus = bytData[13];
        
//保留扇区数
        UInt16 BPB_RsvdSecCnt = (UInt16)(bytData[15<< 8 | bytData[14]);
        
//FAT表的个数
        byte BPB_NumFATs = bytData[16];

        
//FAT表的个数必须为2
        if (BPB_NumFATs != 2return 0;

        
//根目录项数(32字节为单位)
        UInt16 BPB_RootEntCnt = (UInt16)(bytData[18<< 8 | bytData[17]);
        
//分区总扇区数(<32M时用)
        UInt16 BPB_TotSec16 = (UInt16)(bytData[20<< 8 | bytData[19]);
        
//每个FAT占的扇区数
        UInt16 BPB_FATSz16 = (UInt16)(bytData[23<< 8 | bytData[22]);
        
//分区总扇区数(>=32M时用)
        UInt32 BPB_TotSec32 = (UInt32)(bytData[35<< 24 | bytData[34<< 16 | bytData[33<< 8 | bytData[32]);
        
//每个FAT占的扇区数(FAT32)
        UInt32 BPB_FATSz32 = (UInt32)(bytData[39<< 24 | bytData[38<< 16 | bytData[37<< 8 | bytData[36]);

        UInt64 FATSz 
= 0, TotSec = 0, DataSec = 0;
        UInt64 RootDirSectors 
= (UInt64)(((BPB_RootEntCnt * 32+ (BPB_BytsPerSec - 1)) / BPB_BytsPerSec);

        
if (BPB_FATSz16 != 0)
            FATSz 
= BPB_FATSz16;
        
else
            FATSz 
= BPB_FATSz32;

        
if (BPB_TotSec16 != 0)
            TotSec 
= BPB_TotSec16;
        
else
            TotSec 
= BPB_TotSec32;

        DataSec 
= TotSec - (BPB_RsvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors);
        UInt64 CountofClusters 
= DataSec / BPB_SecPerClus;
        
if (CountofClusters < 4085)
        
{
            
/* FAT 类型是FAT12 */
            
return 1;
        }

        
else if (CountofClusters < 65525)
        
{
            
/* FAT 类型是FAT16 */
            
return 2;
        }

        
else
        
{
            
/* FAT 类型是FAT32*/
            
return 3;
        }

    }
           
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值