ถอดรหัสรายการไดเรกทอรี Microsoft MS-DOS 5.0 FAT


27

ระบบไฟล์ 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
  • สองไบต์ถัดไป (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ชุดธงที่ถูกต้องจะเป็นอย่างไร
Morgan Thrapp

@ MorganThrapp แน่นอนว่าควรจะดี
AdmBorkBork

จากความอยากรู้อยากเห็นคุณได้รับประสบการณ์มากมายจากการโต้ตอบกับ MS-DOS 5.0 ในวันนั้นหรือคุณเบื่อวิกิพีเดียเพียงวันเดียวหรือไม่?
แมว

3
@cat บางส่วนของทั้งคู่ ฉันสนใจในคอมพิวเตอร์มากตั้งแต่อายุประมาณ 5 ปีและได้รับ Commodore VIC-20 หนึ่งในโครงงานวิทยาศาสตร์คอมพิวเตอร์ระดับต้นของฉันเมื่อประมาณ 10 ปีที่แล้วคือการสร้างระบบไฟล์ของเราเองดังนั้นฉันจึงทำการวิจัยมากมาย สำหรับเรื่องนี้ฉันดึงพวงจากวิกิพีเดียและตัดมันเป็นสิ่งที่อาจเป็นความท้าทาย
AdmBorkBork

คำตอบ:


6

Verilog, 513 670 617 ไบต์

ทำงานโดยใช้ IVerilog ไม่จำเป็นต้องมีการรวบรวมสถานะพิเศษ

นี่คือสัตว์ประหลาดของคำจำกัดความซ้อนกัน, twiddling บิตและความน่ารำคาญของการต้องสั่งซื้อบิตเนื่องจาก endianness (มิฉะนั้นสตริงไม่ได้พิมพ์หรือลำดับบิตจำนวนไม่ถูกต้อง) อินพุตถูกนำผ่านiพอร์ตซึ่งเป็นวิธีปกติในการรับข้อมูลเข้าในโมดูล Verilog $displayใช้เพื่อพิมพ์ออกมาตรฐาน สามารถบันทึก 6 ไบต์หากไม่จำเป็นต้องมีศูนย์นำหน้าสำหรับการประทับเวลา

`define r(o,b)wire[3:0]o;assign o={i[b],i[b+1],i[b+2],i[b+3]}; 
`define R(t,a,b,c,d,s)`r(a,s)`r(b,s+4)`r(c,s+8)`r(d,s+12)wire[15:0]t;assign t={a,b,c,d};
`define p(m,k)i[90+m]?"k":"",
`define F(a,b)"a a a b\t b%d"
module f(input[0:255]i);`R(d,q,w,e,r,112)`R(D,Q,W,E,R,128)`R(s,z,x,c,v,224)`R(S,Z,X,C,V,240)`R(p,t,y,u,o,176)`R (A,b,n,m,l,192)always@(i)$display(`F(%s%s%s,%02d:%02d:%02d%d/%d/%d),i[0:63],i[64:87]=="   "?" ":".",i[64:87],`p(5,RO)`p(4,H)`p(3,S)`p(2,VL)`p(1,SD)`p(0,A)d[15:11],d[10:5],d[4:0]*2,D[15:9]+1980,D[8:5],D[4:0],p[15:11],p[10:5],p[4:0]*2,A[15:9]+1980,A[8:5],A[4:0],|i[91:92]?0:{s,S});endmodule

การสาธิต

Testbench (ไม่ได้คะแนน):

`timescale 1ns / 1ps

module ftest;
reg [0:255] i;
f uut (
.i(i)
);
initial begin
    i=256'b0111000001110010011011110110011101110010011000010110110101101101011010010110111001100111000001100000000000000000101000100100010001001000110101000000000000000000000000000000000010100010010001000100100011010100000000000000000000000000000000001101000000000000;
    #100;
i=256'b0010000000100000001000000010000001110000011100000110001101100111001000000010000000100000000101000000000000000000010111010110110000111101100111110000000000000000000000000000000010100010010001000100100011010100000000000000000011110000000100111111001011100001;     
end

endmodule

ตัวอย่างการเรียกใช้:

$ iverilog design.sv testbench.sv  && vvp a.out  
programm.ing   HS      20:18:08       2016/ 6/20      53248
    ppcg        S  SD  11:43:24       2010/12/31          0

5

Python, 485, 479, 442, 438, 431, 429, 418, 402, 395, 391 , 391 , 370 ไบต์

บันทึกแล้ว 19 ไบต์ขอบคุณCᴏɴᴏʀO'Bʀɪᴇɴเตือนฉันว่าฉันสามารถกำหนดฟังก์ชั่นให้กับจดหมาย

บันทึก 6 ไบต์ด้วยคำแนะนำจาก FryAmTheEggman ในการล้างข้อมูลตัวกรอง bitmask

บันทึกแล้ว 21 ไบต์ด้วยคำตอบ Ruby ที่ยอดเยี่ยมของ W0lf บังคับให้ฉันลงมือทำสิ่งนี้ลงอีก ;)

นี่คือสัตว์ประหลาดแน่นอน ค่อนข้างแน่ใจว่าฉันสามารถลดมันลงได้อีกเล็กน้อย แต่มันก็ใกล้เคียงกับการเล่นกอล์ฟมากขึ้น

a=input()
j=''.join
n=lambda v:int(v,2)
f=j('RO H S VL SD A'.split()[i]for i in range(6)if n(a[88:96])&2**i)
print(j(chr(n(a[x:x+8])).strip()+'.'*(x==56)for x in range(0,88,8)).strip('.'),f,j('%02d:%02d:%02d'%(n(a[b-11:b-6]),n(a[b-6:b]),n(a[b:b+6]))+' %d/%d/%d '%(n(a[b+6:b+12])+1980,n(a[b+12:b+16]),n(a[b+16:b+21]))for b in[123,187]),n(a[208:])*(1-('V'in f or'D'in f)))

บางทีคุณสามารถมอบหมายintให้คนงาน? str intหรืออาจจะให้ฟังก์ชั่นที่จะดำเนินการ
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴความคิดที่ดี!
Morgan Thrapp

ช่องว่างระหว่างor 'SD'สามารถถอดออกได้ฉันคิดว่า
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴใช่เพิ่งทำเช่นนั้น
Morgan Thrapp

ว้าว. ค่อนข้างสั้นกว่าที่ฉันคาดไว้คำตอบ
AdmBorkBork

4

Haskell, 781 710 ไบต์

ขอบคุณ BlackCap สำหรับการทำให้เข้าใจง่าย

w n=('0'<$[1..2-length a])++a where a=show n
x s=tail.foldr(\a b->s:a++b)""
t=snd.span(==' ')
y a|all(==' ')a=""|0<1='.':t a
nm=(\(a,b)->t a++y b).splitAt 8
ms n(r,s)|n`mod`2^(r+1)`div`2^r>0=s|0<1=""
tm n=x ':'[w$n`div`2^11,w$n`mod`2^11`div`32,w$2*n`mod`64]
dt n=x '/'[w$1980+n`div`2^9,w$n`mod`2^9`div`32,w$n`mod`32]
pa s=x ' '[nm.map(toEnum.v.take 8).takeWhile(not.null)$iterate(drop 8)a,t,dt$v i,tm$v g,dt$v o,tm$v m,show u,"\n"]where{z n=splitAt(8*n);(a,b)=z 11 s;(c,d)=z 1 b;(e,f)=z 2 d;(g,h)=z 2 f;(i,j)=z 2 h;(k,l)=z 4 j;(m,n)=z 2 l;(o,p)=z 2 n;(q,r)=z 2 p;t=(zip [0..](words"RO H S VL SD A")>>=).ms$v c;u|any(`elem`t)"LD"=0|0<1=v r;v=foldl((+).(2*))0.map(read.pure).filter(`elem`"01")}
main=interact pa

นอกจากนี้ยังช่วยให้ขยะ (เช่นอักขระขึ้นบรรทัดใหม่) ปรากฏขึ้นหลังอินพุต


เตรียมผลไม้แขวนไว้ให้คุณ: pastebin.com/X69jH75f
BlackCap

3

Java, 1721 1587 1573 1560 1511 ไบต์:

import java.util.*;class A{int Q(String a,int b){return Integer.parseInt(a,b);}String P(int a){return Integer.toString(a);}ArrayList<String>B=new ArrayList<String>();void J(String O){B.add(O);}String TD(String l,String p,int a,int c,int d){String X,Y,Z;X=Y=Z=new String();int i=0;for(char F:l.toCharArray()){if(i<a){X+=F;}if(a<=i&i<c){Y+=F;}if(c<=i){Z+=F;}i++;}String[]H=new String[3];H[0]=P(d+Q(X,2));H[1]=P(Q(Y,2));H[2]=(p==":")?P(Q(Z,2)*2):P(Q(Z,2));int T=0;for(String A:H){H[T]=(A.length()<2)?"0"+A:A;T++;}return H[0]+p+H[1]+p+H[2];}String D(String i){String K=new String();int L=0;for(char Y:i.toCharArray()){if(L%8<1){K+=" ";}K+=Y;L++;}String[]C=K.split(" ");String[]z={"RO","H","S","VL","SD","A"};int[]l={1,2,4,8,16,32};Map<Integer,String>U=new HashMap<Integer,String>();for (int e=0;e<l.length;e++){U.put(l[e],z[e]);}String[]N={":","/",":","/"};int[]M={15,17,23,25};int[]O={5,7,5,7};int[]P={0,1980,0,1980};for(int y=1;y<9;y++){if((char)Q(C[y],2)!=' '){J(Character.toString((char)Q(C[y],2)));}}for(int v=9;v<12;v++){if((char)Q(C[v],2)!=' '){if(!B.contains(".")){J(".");}J(Character.toString((char)Q(C[v],2)));}}J(" ");int T=(char)Q(C[12],2);while(T>0){int H=l[0];for(int V:l){if(V<=T){H=V;}}J(U.get(H));T-=H;}for(int w=0;w<4;w++){J(" ");J(TD(C[M[w]]+C[M[w]+1],N[w],O[w],11,P[w]));}J(" ");if(B.contains("SD")||B.contains("VL")){J("0");}else{J(P(Q(C[29]+C[30]+C[31]+C[32],2)));}return String.join("",B);}public static void main(String[]a){A H=new A();System.out.print(H.D(new Scanner(System.in).next()));}}

รับอินพุตในรูปแบบของสตริงไบนารี 32 ไบต์ เอาต์พุตในรูปแบบของสตริงคั่นด้วยช่องว่าง นี่อาจเป็นคำตอบที่ยาวมากแต่ฉันก็ยังไม่ผิดหวัง ฉันแค่ดีใจที่ฉันสามารถนำไปใช้ใน Java ฉันจะยังคงพยายามเล่นกอล์ฟให้มากที่สุดเท่าที่จะทำได้

ลองออนไลน์! (Ideone)


1
+1 เนื่องจากการใช้ Java สำหรับปัญหาระดับต่ำนั้นเป็นเรื่องที่น่ายินดี (เหมือน Haskell ของฉัน)
Fox

2

ทับทิม 344 ไบต์

m=gets
s=->b,l{b.slice!(0,l).to_i 2}
t=->b{'%02d:%02d:%02d %d/%d/%d'%[s[b,5],s[b,6],2*s[b,5],s[b,7]+1980,s[b,4],s[b,5],]}
i=(0..q=32).map{|i|m[i*8,8].to_i 2}
c=i.map(&:chr).join
n=c[0,8].strip
e=c[8,3].strip
e>?!&&n<<?.+e
f=''
6.times{|j|i[11][j]>0&&f<<%w(RO H S VL SD A)[j]}
$><<[n,f,t[m[112,q]],t[m[176,q]],(f[/VL|SD/]?0:m[-q,q].to_i(2))]*' '

รุ่นเล็กน้อยสามารถอ่านเพิ่มเติมได้ที่นี่

การทดสอบออนไลน์: http://ideone.com/Fww1Rw


1
ทำได้ดีนี่! ดูเหมือนว่าฉันต้องตีกอล์ฟออกไปอีก 27 ไบต์ ;)
Morgan Thrapp

2

JavaScript (ES6), 369

(b,Z=n=>n>9?n:'0'+n,W=n=>s[n]<<8|s[n+1],U=n=>[Z((t=W(n))>>11)+`:${Z(t>>5&63)}:`+Z(t%32*2),((t=W(n+2))>>9)+1980+`/${t>>5&15}/`+t%32],X=l=>String.fromCharCode(...s.slice(p,p+=l)).trim(),s=b.match(/.{8}/g).map(x=>+('0b'+x)),p=0)=>[X(8)+((x=X(3))?'.'+x:x),[...b].map((b,i)=>'A,SD,VL,S,H,RO'.split`,`[z=(2*z|b)%4294967296,i*b-90]||'',z=0).join``,U(14),U(22),b[92]|b[91]?0:z]

น้อย golfed

(b,
  Z=n=>n>9?n:'0'+n, // zero pad
  W=n=>s[n]<<8|s[n+1], // get word
  U=n=>[
   Z((t=W(n))>>11)+`:${Z((t>>5&63)}:`+Z(t%32*2),  // decode time
   ((t=W(n+2))>>9)+1980+`/${t>>5&15}/`+t%32 // decode date
  ],
  X=l=>String.fromCharCode(...s.slice(p,p+=l)).trim(), // extract space padded string
  s=b.match(/.{8}/g).map(x=>+('0b'+x)), // convert bits to bytes
  p=0
)=>
  [ X(8)+((x=X(3))?'.'+x:x),
    [...b].map((b,i)=>'A,SD,VL,S,H,RO'.split`,`[i*b-90]||'').join``,
    [...b].slice(-32).map((b,i)=>z=2*z|b,z=0), // this line merged with the preceding one in the golfed code
    U(14),U(22),
    b[92]|b[91]?0:z
  ]

ทดสอบ

f=(b,Z=n=>n>9?n:'0'+n,W=n=>s[n]<<8|s[n+1],U=n=>[Z((t=W(n))>>11)+`:${Z(t>>5&63)}:`+Z(t%32*2),((t=W(n+2))>>9)+1980+`/${t>>5&15}/`+t%32],X=l=>String.fromCharCode(...s.slice(p,p+=l)).trim(),s=b.match(/.{8}/g).map(x=>+('0b'+x)),p=0)=>[X(8)+((x=X(3))?'.'+x:x),[...b].map((b,i)=>'A,SD,VL,S,H,RO'.split`,`[z=(2*z|b)%4294967296,i*b-90]||'',z=0).join``,U(14),U(22),b[92]|b[91]?0:z]

O.textContent+='\n'+f('0111000001110010011011110110011101110010011000010110110101101101011010010110111001100111000001100000000000000000101000100100010001001000110101000000000000000000000000000000000010100010010001000100100011010100000000000000000000000000000000001101000000000000')
O.textContent+='\n'+f('0010000000100000001000000010000001110000011100000110001101100111001000000010000000100000000101000000000000000000010111010110110000111101100111110000000000000000000000000000000010100010010001000100100011010100000000000000000011110000000100111111001011100001')
<pre id=O></pre>


ตกลงดังนั้นฉันวิ่งนี้ใน Safari Script error.และได้ แต่ด้วยเหตุผลบางอย่างใน Firefox ดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์ ฉันสงสัยว่าทำไม ...
R. Kap

@ R.Kap อาจ Safari นั้นรองรับ ES6 น้อยกว่า Firefox kangax.github.io/compat-table/es6
edc65

2

PHP ,301 288 ไบต์

for($b=unpack('A8f/A3e/Cl/n/Nc/N/Nm/n/Ns',$argn);$i<8;$f.=1<<$i++&$b[l]?[RO,H,S,VL,SD,A][$i-1]:'');echo trim($b[f].'.'.$b[e],' .')," $f ",($e=function($a){echo date('H:i:s Y/m/d ',mktime($a>>27&31,$a>>21&63,$a>>15&62,$a>>5&15,$a&31,1980+($a>>9&127)));})($b[c]),$e($b[m]),$b[l]&24?0:$b[s];

ลองออนไลน์!

การป้อนข้อมูลเป็นสตริงคำ 32 ไบต์ผ่านออกไปSTDINSTDOUT

-13 ไบต์เป็นโปรแกรมแบบสแตนด์อโลน


2

Stax , 111 ไบต์

¼ΘUßU'ïMo^ø¬├▓> I¬i⌠·╥.↕¥½ßqS,=frT`d_`&&↓⌠ÉûÆiü=┌-< │∟Φ☼⌐¢3²Bu╜lJ╛§≥╪║ε┐╓ù♫╨Z░╖!¥É:╬Çß═╤às8Q←φ,ºï◘≥Ä£}èΦ╡FÉçø¶É

เรียกใช้และแก้ไขข้อบกพร่อง


โอ๊ะฉันผิดพลาด ฉันจะแก้ไข
เรียกซ้ำ

1
มันทำงานอย่างถูกต้องตอนนี้ที่ราคา 3 ไบต์
เรียกซ้ำ

1

Perl, 249 ไบต์

ใช้ 32 ไบต์เป็นอินพุตเอาต์พุตถูกคั่นด้วยบรรทัดใหม่ unpackเหมาะสำหรับการแยกวิเคราะห์โครงสร้างไบนารีชนิดนี้

($f,$e,$a,$C,$M,$s)=unpack"A8A3CxxNx4Nx2N",<>;$f=~s/ //g;$e=~s/ //g;printf"%s
@{[map+(RO,H,S,VL,SD,A)[$a&1<<$_?$_:9],0..5]}
"."%02d:%02d:%02d %d/%d/%d
"x2 .$s*!($a&24),$f.".$e"x!!$e,map{$_>>27,$_>>21&63,$_>>15&62,$_/512%128+1980,$_>>5&15,$_&31}$C,$M

ไฮไลท์บางส่วน:

  • unpackดังกล่าวข้างต้น
  • ผู้ประกอบการเต่า@{[]}ช่วยให้การแก้ไขรหัสในสตริง มันจะสร้างการอ้างอิงอาร์เรย์ที่ถูกยกเลิกการอ้างอิงแล้ว
  • "$str1"x!!$str2เป็นวิธีที่ดีในการส่งคืน$str1หาก$str2เป็นสตริงที่ไม่ว่างเปล่า

ด้านล่างเป็นรุ่นที่ใช้งานได้กับรายการไดเรกทอรีจริงที่มีเขตข้อมูลแบบ end-endian เพียงละเว้นการเติมช่องว่างที่ถูกต้องในชื่อไฟล์และส่วนขยาย (เช่นเช่น" ppcg"ไม่มีการลบช่องว่างเริ่มต้น) (254 ไบต์)

($f,$e,$a,$C,$M,$s)=unpack"A8A3CxxVx4Vx2V",<>;$f=~s/ +$//;$e=~s/ +$//;printf"%s
@{[map+(RO,H,S,VL,SD,A)[$a&1<<$_?$_:9],0..5]}
"."%02d:%02d:%02d %d/%d/%d
"x2 .$s*!($a&24),$f.".$e"x!!$e,map{$_>>11&31,$_>>5&63,2*$_&63,($_>>25)+1980,$_>>21&15,$_>>16&31}$C,$M
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.