Hệ thống tệp Microsoft FAT có bảng thư mục để thể hiện "tệp" nào trong đó "thư mục" trên đĩa. Hiện tại, các mục này nhồi nhét rất nhiều thông tin vào một lượng nhỏ bit. Có rất nhiều thông số kỹ thuật trên Wiki cho người tò mò, nhưng thách thức ở đây là tập trung vào giải mã "đơn giản" của một mục.
Mỗi mục bao gồm một từ nhị phân 32 byte, được chia thành nhiều phần. Để thống nhất trong thử thách này, chúng tôi sẽ sử dụng phiên bản MS-DOS 5.0, các byte được đặt hàng là endian lớn và chúng tôi gọi byte 0x00
là cực trái và byte 0x1F
là cực phải.
Dưới đây là một sơ đồ ngắn gọn của các phần có liên quan, và những gì nên là đầu ra cho mỗi phần ( in đậm ).
- 11 byte đầu tiên là tên tệp ở định dạng ASCII (đây là tên tệp 8.3 nổi tiếng đến từ - 8 byte cho tên tệp, 3 byte cho phần mở rộng). Đây là các mã hóa ASCII thẳng và nên được xuất thành ASCII với khoảng thời gian (.) Giữa .
- Lưu ý: cả 8 và 3 phần đều được đệm bằng khoảng trắng để tạo một mục nhập có độ dài đầy đủ. Đầu ra nên bỏ qua khoảng trắng (nghĩa là không xuất chúng).
- Phần mở rộng tệp có thể trống (nghĩa là tất cả các khoảng trắng), trong trường hợp đó, đầu ra không được xuất dấu chấm .
- Vì ASCII chỉ sử dụng 7 bit thấp hơn, nên tất cả các byte sẽ dẫn đầu
0
.
- Byte tiếp theo (0x0b) là một bitmask sau:
- 0x01 Chỉ đọc - đầu ra RO
- 0x02 Ẩn - đầu ra H
- Hệ thống 0x04 - đầu ra S
- Nhãn khối lượng 0x08 - đầu ra VL . Kích thước tệp (bên dưới) phải là đầu ra là 0 , bất kể mục nhập thực tế của nó.
- Thư mục con 0x10 - đầu ra SD . Kích thước tệp (bên dưới) phải là đầu ra là 0 , bất kể mục nhập thực tế của nó.
- Lưu trữ 0x20 - đầu ra A
- Thiết bị 0x40 - bỏ qua cho thử thách này.
- 0x80 Dành riêng - bỏ qua cho thử thách này.
- Vì đây là bitmask, nên có thể có nhiều cờ - tất cả các kết quả đầu ra có thể được nối với nhau theo bất kỳ thứ tự nào. Ví dụ,
0xff
có thể làROHSVLSDA
(hoặc bất kỳ sự kết hợp nào khác).
- Hai byte tiếp theo (0x0c và 0x0d) không được sử dụng trong MS-DOS 5.0.
- Hai byte tiếp theo (0x0e và 0x0f) là thời gian tạo như sau:
- Các bit 15 đến 11 là các giờ ở định dạng 24 giờ - đầu ra 00 đến 23
- Các bit 10 đến 5 là phút - đầu ra 00 đến 59
- Các bit 4 đến 0 là giây / 2 - đầu ra 00 đến 58 (lưu ý rằng giây chỉ ở độ phân giải hai giây)
- Để làm rõ:
hhhhhmmmmmmsssss
khi viết big-endian.
- Hai byte tiếp theo (0x10 và 0x11) là ngày tạo như sau:
- Bit 15 đến 9 là năm - sản lượng 1980 cho
0
tới 2107 cho127
- Các bit 8 đến 5 là các tháng - đầu ra 1 đến 12 (có hoặc không có số 0 đứng đầu)
- Các bit 4 đến 0 là ngày - đầu ra 0 đến 31 (có hoặc không có số 0 đứng đầu)
- Để làm rõ:
yyyyyyymmmmddddd
khi viết big-endian.
- Bit 15 đến 9 là năm - sản lượng 1980 cho
- Hai byte tiếp theo (0x12 và 0x13) là ngày truy cập cuối cùng. Mặc dù được sử dụng trong MS-DOS 5.0, chúng tôi bỏ qua phần này cho thử thách này.
- Hai byte tiếp theo (0x14 và 0x15) không được MS-DOS 5.0 sử dụng.
- Hai byte tiếp theo (0x16 và 0x17) là lần sửa đổi cuối cùng, theo cùng định dạng với thời gian tạo, ở trên.
- Hai byte tiếp theo (0x18 và 0x19) là ngày sửa đổi cuối cùng, theo cùng định dạng với ngày tạo, ở trên.
- Hai byte tiếp theo (0x1a và 0x1b) là vị trí cụm của tệp trên đĩa. Chúng tôi đang bỏ qua phần này cho thử thách này.
- Bốn byte cuối cùng (0x1c, 0x1d, 0x1e và 0x1f) là kích thước tệp - đầu ra dưới dạng một số nguyên không dấu , trừ khi các cờ VL hoặc SD được đặt (ở trên), trong trường hợp này là đầu ra
0
.
Đại diện trực quan
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/
Đầu vào
- Một từ 32 byte đơn (nghĩa là 256 bit), ở bất kỳ định dạng nào đều thuận tiện.
- Đây có thể là một chuỗi
1
và0
, như một sốint
s không dấu , một mảng các giá trị Boolean, v.v. - Vui lòng xác định trong câu trả lời của bạn định dạng bạn đang sử dụng cho đầu vào.
- Bạn không thể lấy nhiều đầu vào (nghĩa là một mảng được chia trước thành các kích thước byte có liên quan) trừ khi đó là cách duy nhất để ngôn ngữ của bạn lấy đầu vào. Phân tích cú pháp đầu vào là một phần của thách thức.
- Đây có thể là một chuỗi
- Bạn có thể cho rằng đầu vào là hợp lệ (ví dụ: bạn không cần thực hiện kiểm tra ngày để xác minh rằng ngày đó là hợp lệ).
- Byte không được sử dụng có thể là tất cả
0
, tất cả1
, v.v., miễn là chúng có mặt. Trong các ví dụ dưới đây, tôi đã sử dụng tất cả0
cho các byte không sử dụng.
Đầu ra
Hoặc được in ra màn hình hoặc trả lại, như sau:
- Tên tệp dưới dạng chuỗi ASCII
- Các thuộc tính tệp dưới dạng chuỗi ASCII
- Thời gian tạo và ngày tạo, với các dấu phân cách thích hợp (dấu hai chấm, dấu gạch chéo, một cái gì đó để phân biệt các thành phần)
- Thời gian sửa đổi và ngày sửa đổi, một lần nữa với các dấu phân cách thích hợp
- Kích thước tập tin
Đầu ra có thể là một chuỗi đơn được phân tách bằng dấu cách hoặc dòng mới, các phần tử riêng biệt trong một mảng, v.v. Vui lòng chỉ định trong câu trả lời của bạn cách định dạng đầu ra của bạn.
Quy tắc
- Các định dạng I / O tiêu chuẩn được chấp nhận.
- Một chương trình đầy đủ hoặc một chức năng được chấp nhận.
- Sơ hở tiêu chuẩn bị cấm.
- Đây là môn đánh gôn , vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất sẽ thắng.
- Tích hợp thực hiện chính xác chức năng này đều bị cấm.
Ví dụ
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
là một bộ cờ hợp lệ?