Microsoft MS-DOS 5.0 FAT 디렉토리 항목 디코딩


27

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빅 엔디안을 쓸 때.
  • 다음 두 바이트 (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 10unsigned int, 부울 값의 배열 등 의 문자열 및 로 될 수 있습니다 .
    • 입력에 사용중인 형식을 답으로 지정하십시오.
    • 당신은 할 수없는 그이 아닌 경우 (즉, 배열이 관련 바이트 크기로 깨진 사전) 여러 입력을 단지 언어 입력을위한 방법. 입력 파싱은 도전의 일부입니다.
  • 입력이 유효하다고 가정 할 수 있습니다 (예를 들어, 날짜가 유효한지 확인하기 위해 날짜 확인을 수행 할 필요가 없습니다).
  • 사용되지 않는 바이트는 존재하는 한 all 0, all 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 2016 년

@MorganThrapp 물론입니다. 괜찮습니다.
AdmBorkBork 2016 년

호기심 때문에, 하루에 MS-DOS 5.0과 상호 작용 한 경험이 많았습니까, 아니면 하루 만에 Wikipedia에서 정말 지루 했습니까?
고양이

3
@cat 둘 중 일부. 5 살 때부터 컴퓨터에 큰 관심을 보였으며 Commodore VIC-20을 받았습니다. 약 10 년 전 저의 대학원 수준의 컴퓨터 과학 프로젝트 중 하나는 자체 파일 시스템을 구축하는 것이 었습니다. 이를 위해 Wiki에서 무리를 가져 와서 도전 할 수있는 것으로 파싱했습니다.
AdmBorkBork 2016 년

답변:


6

Verilog를, 513 670 617 바이트

IVerilog를 사용하여 실행합니다. 특별한 컴파일 플래그가 필요하지 않습니다.

이것은 중첩 된 정의, 비트 비틀림 및 엔디안으로 인해 비트 순서를 뒤집어 야하는 성가신입니다 (그렇지 않으면 문자열이 인쇄되지 않거나 숫자 비트 순서가 잘못됨). 입력은 i포트를 통해 이루어 지며, 이는 일반적으로 Verilog 모듈에 입력하는 방법입니다. $display표준 출력으로 인쇄하는 데 사용됩니다. 타임 스탬프에 선행 0이 필요하지 않은 경우 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

데모

테스트 벤치 (점수 없음) :

`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 , 370 바이트

19 바이트를 절약했습니다. Cᴏɴᴏʀ O'Bʀɪᴇɴ에게 감사의 말을 전합니다.

FryAmTheEggman의 제안으로 비트 마스크 필터를 정리하여 6 바이트를 절약했습니다.

W0lf의 멋진 Ruby 답변 덕분에 21 바이트를 절약 할 수있었습니다. ;)

이것은 절대 괴물이다. 좀 더 잘라낼 수는 있지만 골프를 치는 데 점점 가까워지고 있습니다.

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 2016 년

사이 공간은 or 'SD'제거 될 수 있다고 생각합니다.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ 네, 방금 했어요.
Morgan Thrapp 2016 년

와우. 내가 기대했던 것보다 훨씬 짧습니다.
AdmBorkBork 2016 년

4

하스켈, 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로 구현할 수있어서 기쁩니다. 그래도 나는 이것을 가능한 한 많이 골프를 치려고 노력할 것이다.

온라인으로 사용해보십시오! (아이디어)


1
+1 낮은 수준의 문제에 Java를 사용하는 것은 유쾌하지 않습니다 (하스켈과 매우 유사)
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

자바 스크립트 (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]

덜 골프

(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는 Firefox보다 ES6와 호환되지 않을 수 있습니다. 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 바이트 워드 문자열을 통해 STDIN출력됩니다 STDOUT.

독립형 프로그램으로 -13 바이트


2

Stax , 111 바이트

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

실행 및 디버깅


죄송합니다. 수정하겠습니다.
재귀

1
3 바이트의 비용으로 올바르게 작동합니다.
재귀

1

펄, 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 .
  • turtle 연산자를 @{[]}사용하면 문자열에 코드를 보간 할 수 있습니다. 실제로 배열 참조를 만든 다음 역 참조됩니다.
  • "$str1"x!!$str2비어 있지 않은 문자열 인 $str1경우에만 반환하는 좋은 방법 $str2입니다.

아래는 리틀 엔디안 필드와 함께 실제 디렉토리 항목에서 작동하고 파일 이름 및 확장자에서 오른쪽 여백 만 무시하는 버전입니다 (예 : " 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.