Microsoft FAT文件系统具有一个目录表,用于表示磁盘上哪些“文件”位于哪个“文件夹”中。暂时,这些条目将大量信息塞满了少量比特。出于好奇,Wiki上有很多技术规范,但是这里的挑战将集中在条目的“简单”解码上。
每个条目由一个32字节的二进制字组成,分为几个部分。为了在此挑战中保持一致,我们将使用MS-DOS 5.0版本,字节顺序为big endian,并且将byte 0x00
称为最左边,将byte 0x1F
称为最右边。
以下是相关部分的简要示意图,以及每个部分的输出(以粗体显示)。
- 前11个字节是ASCII格式的文件名(这是著名的8.3文件名的来源-文件名8个字节,扩展名3个字节)。这些是直接的ASCII编码,应以ASCII(。)之间的形式输出。
- 注意:第8部分和第3部分都用空格填充,以进行全长输入。输出应忽略空格(即,不输出空格)。
- 文件扩展名可能为空(即所有空格),在这种情况下,输出不应输出点。
- 由于ASCII仅使用低7位,因此所有字节均具有前导
0
。
- 下一个字节(0x0b)是以下内容的位掩码:
- 0x01只读-输出RO
- 0x02隐藏-输出H
- 0x04系统-输出S
- 0x08音量标签输出VL。文件大小(以下)应输出为0,无论其实际输入如何。
- 0x10子目录-输出SD。文件大小(以下)应输出为0,无论其实际输入如何。
- 0x20存档-输出A
- 0x40设备-此挑战被忽略。
- 0x80保留-对于此挑战被忽略。
- 由于这是位掩码,因此可能有多个标志-所有适用的输出应以任意顺序串联在一起。例如,
0xff
可以是ROHSVLSDA
(或任何其他组合)。
- 在MS-DOS 5.0下不使用接下来的两个字节(0x0c和0x0d)。
- 接下来的两个字节(0x0e和0x0f)是创建时间,如下所示:
- 位15到11是24小时格式的小时-输出00到23
- 位10到5是分钟-输出00到59
- 位4到0是秒数/ 2-输出00到58(请注意,秒仅是两秒的分辨率)
- 为了澄清:
hhhhhmmmmmmsssss
写大端时。
- 接下来的两个字节(0x10和0x11)是创建日期,如下所示:
- 位15至9年-输出1980年的
0
高达2107对127
- 位8到5是月份-输出1到12(带或不带前导零)
- 位4至0是日期-输出0至31(带或不带前导零)
- 为了澄清:
yyyyyyymmmmddddd
写大端时。
- 位15至9年-输出1980年的
- 接下来的两个字节(0x12和0x13)是最后访问日期。在MS-DOS 5.0中使用时,我们将忽略此部分的挑战。
- MS-DOS 5.0不使用接下来的两个字节(0x14和0x15)。
- 接下来的两个字节(0x16和0x17)是最后修改的时间,遵循与上面创建时间相同的格式。
- 接下来的两个字节(0x18和0x19)是最后修改日期,其格式与上面的创建日期相同。
- 接下来的两个字节(0x1a和0x1b)是文件在磁盘上的群集位置。对于这一挑战,我们将忽略这一部分。
- 最后四个字节(0x1c,0x1d,0x1e和0x1f)是文件大小-输出为 无符号整数,除非设置了VL或SD标志(在上面),否则输出
0
。
视觉表现
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
输入项
- 单个32字节字(即256位),采用任何方便的格式。
- 这可能是作为一个串
1
并0
作为几个无符号int
S,布尔值的阵列等 - 请在您的答案中指定您使用的输入格式。
- 您不能接受多个输入(即,将数组预分解为相关的字节大小),除非是您的语言接受输入唯一方法,。解析输入是挑战的一部分。
- 这可能是作为一个串
- 您可以假定输入是有效的(例如,您不需要执行日期检查来验证日期是否有效)。
- 只要存在,未使用的字节就可以是all
0
,all1
等。在以下示例中,我使用了所有0
用于未使用的字节。
输出量
打印到屏幕或返回以下内容:
- 文件名作为ASCII字符串
- 文件属性为ASCII字符串
- 创建时间和创建日期,并带有适当的分隔符(冒号,斜杠,用于区分组件的内容)
- 修改的时间和修改的日期,再次使用适当的分隔符
- 档案大小
输出可以是用空格或换行符分隔的单个字符串,数组中的单独元素等。请在答案中指定输出的格式。
规则
例子
0111000001110010011011110110011101110010011000010110110101101101011010010110111001100111000001100000000000000000101000100100010001001000110101000000000000000000000000000000000010100010010001000100100011010100000000000000000000000000000000001101000000000000
programm.ing HS 20:18:08 2016/06/20 20:18:08 2016/06/20 53248
0010000000100000001000000010000001110000011100000110001101100111001000000010000000100000000101000000000000000000010111010110110000111101100111110000000000000000000000000000000010100010010001000100100011010100000000000000000011110000000100111111001011100001
ppcg SDS 11:43:24 2010/12/31 20:18:08 2016/06/20 0
SD S
设置有效的标志吗?