1.介绍文件目录项
FAT每一个文件目录项都是32个字节,格式如下
偏移量 | 长度 | 描述 |
---|---|---|
0 | 8 | 文件名 |
8 | 3 | 文件扩展名 |
11 | 1 | 文件属性 |
12 | 10 | 保留位 |
22 | 2 | 最后修改时间 |
24 | 2 | 最后修改日期 |
26 | 2 | 首簇号 |
28 | 4 | 文件大小 |
2.时间格式
日期和时间都是从1980年算起。
FAT12文件目录项的25、26字节,一共16位储存日期。从高到低,前7位为年偏移量year,接下来4位为月偏移量month,最后5位为日偏移量day;得到的最终时间即为1980 + year年,0 + month月,0 + day日。每位表示的意义如下:
长度 | 描述 |
---|---|
7 | 年偏移量 |
4 | 月偏移量 |
5 | 日偏移量 |
FAT12文件目录项的23、24字节,一共16位储存日期。从高到低,前5位为小时的偏移量hour,接下来6位为分钟偏移量minute;最终得到的时间就是:hour小时:minute分钟。每位的意义如下:
长度 | 描述 |
---|---|
5 | 小时偏移量 |
6 | 分钟偏移量 |
5 | 保留 |
3.使用C语言输出
首先看如何提取日期,时间的提取要比日期简单得多
void print_date(unsigned short _date)
{
// 提取出年
unsigned short year = _date & 0b1111111000000000;
year = year >> 9;
// 提取月
unsigned short month = _date & 0b0000000111100000;
month = month>> 5;
// 提取日
unsigned short day = _date & 0b0000000000011111;
printf("%02u-%02u-%02u", month, day, (year + 80) % 100);
}
这里对年的提取做一些说明。
假设输入的_data为0x1cbf,对应的二进制数为0001 1100 1011 1111。首先用按位与操作,将16位的unsigned short的后9位置零,前7位保留。这样得到0001 1100 0000 0000。将得到的数字右移9位得到0000 0000 0001 1100,也就是14。加上1980得到1994年。
如果运行该函数,输入0x1cbf,得到的最终输出为05-31-94。实际上这个是DOS系统的COMMAND程序的创建日期。
下面的得到时间的函数就很简单了
// 提取FAT12文件目录项中的时间
void print_time(unsigned short _time)
{
// 提取小时
unsigned short hour = _time & 0b1111100000000000;
hour = hour >> 11;
//提取分钟
unsigned short minute = _time & 0b0000011111100000;
minute = minute >> 5;
printf("%02u-%02u", hour, minute);
}
继续用DOS系统的COMMAND程序的例子,这里输入0x6680,得到最终的结果为12-52,也就是中午十二点52分