ระบบไฟล์ Microsoft FAT มีตารางไดเรกทอรีเพื่อแสดงว่า "ไฟล์" ใดที่อยู่ใน "โฟลเดอร์" บนดิสก์ ในขณะนั้นรายการเหล่านี้อัดแน่นข้อมูลจำนวนมากเป็นบิตจำนวนเล็กน้อย มีข้อกำหนดทางเทคนิคมากมายเกี่ยวกับWikiสำหรับผู้อยากรู้อยากเห็น แต่ความท้าทายที่นี่จะมุ่งเน้นไปที่การถอดรหัส "แบบง่าย" ของรายการ
แต่ละรายการประกอบด้วยคำไบนารี 32 ไบต์แบ่งออกเป็นหลายส่วน เพื่อความสอดคล้องในการท้าทายนี้เราจะใช้ MS-DOS 5.0 รุ่นไบต์มีการสั่งซื้อเป็นendian ใหญ่และเรากำลังเรียกไบต์0x00
เป็นซ้ายสุดและไบต์0x1F
เป็นขวาที่สุด
ด้านล่างนี้เป็นแผนผังโดยย่อของส่วนที่เกี่ยวข้องและสิ่งที่ควรเป็นผลลัพธ์สำหรับแต่ละส่วน (เป็นตัวหนา )
- 11 ไบต์แรกเป็นชื่อไฟล์ในรูปแบบ ASCII (นี่คือที่ชื่อไฟล์ 8.3 ที่มีชื่อเสียงมาจาก - 8 ไบต์สำหรับชื่อไฟล์, 3 ไบต์สำหรับส่วนขยาย) เหล่านี้คือการเข้ารหัส ASCII แบบตรงและควรมีเอาต์พุตเป็น ASCII ที่มีเครื่องหมายจุด (.) อยู่ระหว่างนั้น
- หมายเหตุ: ทั้งส่วนที่ 8 และ 3 นั้นบุด้วยช่องว่างเพื่อให้เข้าได้เต็มความยาว การส่งออกควรละเว้นช่องว่าง (เช่นอย่าส่งออก)
- นามสกุลไฟล์อาจจะว่างเปล่า (เช่นช่องว่างทั้งหมด) ซึ่งในกรณีนี้การส่งออกควรจะไม่ส่งออกจุด
- เนื่องจาก ASCII ใช้เพียง 7 บิตที่ต่ำกว่าไบต์ทั้งหมดจึงมีการนำ
0
หน้า
- ไบต์ถัดไป (0x0b) เป็นบิตมาสก์ดังต่อไปนี้:
- 0x01 อ่านอย่างเดียว - เอาต์พุตRO
- 0x02 Hidden - output 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 (โปรดทราบว่าวินาทีมีความละเอียดสองวินาทีเท่านั้น)
- สำหรับการชี้แจง:
hhhhhmmmmmmsssss
เมื่อเขียน big-endian
- สองไบต์ถัดไป (0x10 และ 0x11) คือวันที่สร้างดังนี้:
- บิต 15 ถึง 9 เป็นปี - เอาต์พุต1980สำหรับ
0
สูงสุด2107สำหรับ127
- บิต 8 ถึง 5 คือเดือน - เอาต์พุต1ถึง12 (มีหรือไม่มีศูนย์นำหน้า)
- บิต 4 ถึง 0 เป็นวัน - เอาต์พุต0ถึง31 (มีหรือไม่มีศูนย์นำหน้า)
- สำหรับการชี้แจง:
yyyyyyymmmmddddd
เมื่อเขียน big-endian
- บิต 15 ถึง 9 เป็นปี - เอาต์พุต1980สำหรับ
- สองไบต์ถัดไป (0x12 และ 0x13) คือวันที่เข้าถึงล่าสุด ในขณะที่ใช้ใน MS-DOS 5.0 เราไม่สนใจส่วนนี้สำหรับความท้าทายนี้
- สองไบต์ถัดไป (0x14 และ 0x15) ไม่ได้ถูกใช้โดย MS-DOS 5.0
- สองไบต์ถัดไป (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
อาเรย์ของค่าบูลีน ฯลฯ - โปรดระบุคำตอบของคุณว่าคุณใช้รูปแบบใดในการป้อนข้อมูล
- คุณไม่สามารถรับการป้อนข้อมูลหลายรายการ (เช่นอาร์เรย์จะแบ่งย่อยเป็นขนาดไบต์ที่เกี่ยวข้อง) เว้นแต่จะเป็นวิธีเดียวที่ภาษาของคุณจะรับอินพุต การแยกวิเคราะห์อินพุตเป็นส่วนหนึ่งของความท้าทาย
- นี่อาจเป็นสตริงของ
- คุณสามารถสมมติว่าอินพุตถูกต้อง (ตัวอย่างเช่นคุณไม่จำเป็นต้องทำการตรวจสอบวันที่เพื่อยืนยันว่าวันที่นั้นถูกต้อง)
- ไบต์ที่ไม่ได้ใช้อาจเป็นทั้งหมด
0
ทั้งหมด1
และอื่น ๆ ตราบใดที่มีอยู่ ในตัวอย่างด้านล่างฉันใช้ทั้งหมด0
เป็นไบต์ที่ไม่ได้ใช้
เอาท์พุต
พิมพ์ไปที่หน้าจอหรือส่งคืนข้อมูลต่อไปนี้:
- ชื่อไฟล์เป็นสตริง ASCII
- แอ็ตทริบิวต์ไฟล์เป็นสตริง ASCII
- เวลาการสร้างและวันที่สร้างพร้อมตัวคั่นที่เหมาะสม (โคลอนสแลชบางอย่างเพื่อแยกส่วนประกอบ)
- เวลาที่แก้ไขและวันที่แก้ไขอีกครั้งด้วยตัวคั่นที่เหมาะสม
- ขนาดไฟล์
เอาต์พุตสามารถเป็นสตริงเดี่ยวที่คั่นด้วยช่องว่างหรือขึ้นบรรทัดใหม่คั่นองค์ประกอบในอาร์เรย์ ฯลฯ โปรดระบุในคำตอบของคุณว่ารูปแบบเอาต์พุตของคุณเป็นอย่างไร
กฎระเบียบ
- รูปแบบ I / O มาตรฐานเป็นที่ยอมรับ
- ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น
- ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
- นี่คือรหัส - กอล์ฟดังนั้นจึงใช้กฎการตีกอล์ฟตามปกติและรหัสที่สั้นที่สุดชนะ
- บิวด์อินที่มีฟังก์ชั่นนี้เป็นสิ่งต้องห้าม
ตัวอย่าง
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
ชุดธงที่ถูกต้องจะเป็นอย่างไร