Microsoft FAT 파일 시스템에는 디스크의 어느 "폴더"에 어떤 "파일"이 있는지를 나타내는 디렉토리 테이블이 있습니다. 당분간 이러한 항목은 많은 양의 정보를 적은 양의 비트로 만들었습니다. 궁금한 점 에 대해서는 Wiki 에 많은 기술 사양이 있지만 여기서의 과제는 항목의 "단순한"디코딩에 중점을 둘 것입니다.
각 항목은 32 바이트 이진 단어로 구성되며 여러 섹션으로 나뉩니다. 이 문제의 일관성을 유지하기 위해 MS-DOS 5.0 버전을 사용하고 바이트는 빅 엔디안 으로 정렬되며 바이트는 0x00
가장 왼쪽으로, 바이트 0x1F
는 가장 오른쪽으로 호출 합니다.
아래는 관련 섹션에 대한 간략한 개요와 각 섹션의 출력 내용 ( 굵게 표시 )입니다.
- 처음 11 바이트는 ASCII 형식의 파일 이름입니다 (파일 이름은 8 바이트, 확장자는 3 바이트). 이들은 ASCII 코드로 인코딩되며 사이에 마침표 (.)가있는 ASCII 로 출력 되어야합니다 .
- 참고 : 8 개 및 3 개 파트 모두에 공백이 채워져 전체 길이 항목이 작성됩니다. 출력은 공백 을 무시 해야 합니다 (즉, 공백을 출력하지 마십시오).
- 파일 확장자가 비어있을 수 있습니다 (즉, 모든 공백).이 경우 출력에 dot이 출력되지 않아야합니다 .
- ASCII는 하위 7 비트 만 사용하므로 바이트는 모두 선행을 갖습니다
0
.
- 다음 바이트 (0x0b)는 다음의 비트 마스크입니다.
- 0x01 읽기 전용-출력 RO
- 0x02 숨김-출력 H
- 0x04 시스템-출력 S
- 0x08 볼륨 레이블 출력 VL . 파일 크기 (아래)는 실제 항목에 관계없이 0 으로 출력되어야합니다 .
- 0x10 하위 디렉토리 출력 SD . 파일 크기 (아래)는 실제 항목에 관계없이 0 으로 출력되어야합니다 .
- 0x20 아카이브-출력 A
- 0x40 장치-이 시도에서는 무시되었습니다.
- 0x80 예약-이 챌린지는 무시합니다.
- 이것은 비트 마스크이므로 여러 플래그가 가능합니다. 적용 가능한 모든 출력은 순서에 상관없이 함께 연결되어야합니다. 예를 들어, (또는 다른 조합)
0xff
이 될 수 있습니다ROHSVLSDA
.
- 다음 두 바이트 (0x0c 및 0x0d)는 MS-DOS 5.0에서 사용되지 않습니다.
- 다음 두 바이트 (0x0e 및 0x0f)는 다음과 같은 작성 시간입니다.
- 비트 15 ~ 11은 24 시간 형식의 시간입니다. 출력 00 ~ 23
- 비트 10 ~ 5는 분입니다-출력 00 ~ 59
- 비트 4 ~ 0은 초 / 2-출력 00 ~ 58입니다 (초는 2 초 분해능 임).
- 명확히하기 위해 :
hhhhhmmmmmmsssss
빅 엔디안을 쓸 때.
- 다음 두 바이트 (0x10 및 0x11)는 다음과 같이 작성 날짜입니다.
- 비트 15 9 올해 있습니다 - 출력 1980 을 위해
0
최대 2107 에 대한127
- 비트 8 ~ 5는 월입니다-출력 1 ~ 12 (앞에 0이 있거나없는)
- 비트 4 ~ 0은 요일-출력 0 ~ 31 (앞에 0이 있거나없는)
- 명확히하기 위해 :
yyyyyyymmmmddddd
빅 엔디안을 쓸 때.
- 비트 15 9 올해 있습니다 - 출력 1980 을 위해
- 다음 두 바이트 (0x12 및 0x13)가 마지막 액세스 날짜입니다. MS-DOS 5.0에서 사용되는 동안이 문제를 무시하고 있습니다.
- 다음 두 바이트 (0x14 및 0x15)는 MS-DOS 5.0에서 사용되지 않습니다.
- 다음 2 바이트 (0x16 및 0x17)는 위의 생성 시간과 동일한 형식을 따르는 마지막 수정 시간입니다.
- 다음 2 바이트 (0x18 및 0x19)는 위의 생성 날짜와 동일한 형식을 따르는 마지막 수정 날짜입니다.
- 다음 2 바이트 (0x1a 및 0x1b)는 디스크에서 파일의 클러스터 위치입니다. 이 문제에 대해서는이 부분을 무시하고 있습니다.
- 마지막 4 바이트 (0x1c, 0x1d, 0x1e 및 0x1f)는 VL 또는 SD 플래그가 설정되어 있지 않으면 출력 되지 않은 파일 크기 출력 ( 부호없는 정수 ) 입니다.
0
시각적 표현
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
입력
- 편리한 모든 형식의 단일 32 바이트 워드 (예 : 256 비트)
- 이것은 un
1
및0
unsignedint
, 부울 값의 배열 등 의 문자열 및 로 될 수 있습니다 . - 입력에 사용중인 형식을 답으로 지정하십시오.
- 당신은 할 수없는 그이 아닌 경우 (즉, 배열이 관련 바이트 크기로 깨진 사전) 여러 입력을 단지 언어 입력을위한 방법. 입력 파싱은 도전의 일부입니다.
- 이것은 un
- 입력이 유효하다고 가정 할 수 있습니다 (예를 들어, 날짜가 유효한지 확인하기 위해 날짜 확인을 수행 할 필요가 없습니다).
- 사용되지 않는 바이트는 존재하는 한 all
0
, all1
등이 될 수 있습니다 . 아래 예제에서는 사용0
하지 않은 바이트에 모두 사용했습니다.
산출
다음과 같이 화면에 인쇄하거나 반환하십시오.
- ASCII 문자열 인 파일 이름
- ASCII 문자열로서의 파일 속성
- 적절한 구분 기호 (콜론, 슬래시, 구성 요소를 구별 할 수있는 항목)가있는 작성 시간 및 작성 날짜
- 적절한 구분 기호를 사용하여 수정 된 시간 및 수정 된 날짜
- 파일 크기
출력은 공백으로 구분되거나 줄 바꿈으로 구분 된 단일 문자열, 배열의 개별 요소 등이 될 수 있습니다. 출력 형식을 어떻게 지정해야하는지 답을 입력하십시오.
규칙
- 표준 I / O 형식 이 허용됩니다.
- 전체 프로그램 또는 기능이 허용됩니다.
- 표준 허점 은 금지되어 있습니다.
- 이것은 code-golf 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드가 승리합니다.
- 이 기능을 정확하게 수행하는 내장 기능은 금지되어 있습니다.
예
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
유효한 플래그가 설정됩니까?