Microsoft MS-DOS 5.0 FAT dizini girişini çözme


27

Microsoft FAT dosya sistemi, hangi "dosyaların" diskte "klasörlerin" olduğunu gösteren bir dizin tablosuna sahiptir. Zamanla, bu girişler çok fazla bilgiyi az miktarda bit olarak doldurdu. Meraklılar için Wiki'de bir takım teknik özellikler var , ancak buradaki zorluk bir girişin "basit" kodunu çözmeye odaklanacak.

Her giriş, birkaç bölüme ayrılmış 32 baytlık bir ikili kelimeden oluşur. Bu mücadelede tutarlılık için, MS-DOS 5.0 sürümünü kullanacağız, baytlar büyük endian olarak sıralanmıştır ve bayt 0x00en sol, bayt 0x1Fen sağ olarak adlandırılmaktadır.

Aşağıda ilgili bölümlerin kısa bir şeması ve her bölüm için çıktı ne olmalıdır ( koyu renkte ).

  • İlk 11 bayt ASCII formatındaki dosya adıdır (ünlü 8.3 dosya adının - dosya adı için 8 bayt, uzantı için 3 bayt). Bunlar düz ASCII kodlamasıdır ve aralarında bir süre (.) Bulunan ASCII olarak çıkarılmalıdır .
    • Not: Hem 8 hem de 3 parça tam uzunlukta bir giriş yapmak için boşluklarla doldurulur. Çıktı boşlukları görmezden gelmelidir (örn. Onları çıkarmayın).
    • Dosya uzantısı boş olabilir (yani tüm boşluklar), bu durumda çıktı nokta göstermemelidir .
    • ASCII sadece daha düşük 7 bit kullandığından, baytların hepsinde bir lider olacaktır 0.
  • Bir sonraki bayt (0x0b), aşağıdakilerin bir bit maskesidir:
    • 0x01 Salt Okunur - RO çıkışı
    • 0x02 Gizli - H çıkışı
    • 0x04 Sistem - S çıkışı
    • 0x08 Birim Etiketi - çıktı VL . Gerçek boyutuna bakılmaksızın dosya boyutu (aşağıda) 0 olarak verilmelidir .
    • 0x10 Alt Dizin - çıktı SD . Gerçek boyutuna bakılmaksızın dosya boyutu (aşağıda) 0 olarak verilmelidir .
    • 0x20 Arşiv - çıktı A
    • 0x40 Aygıt - bu sorun için göz ardı edildi.
    • 0x80 Ayrılmış - bu sorun için göz ardı edildi.
    • Bu bir bit maskesi olduğundan, birden çok bayrak mümkündür - uygulanabilir tüm çıktılar herhangi bir sırayla bir araya getirilmelidir. Örneğin, 0xffolabilir ROHSVLSDA(veya başka bir kombinasyon).
  • Sonraki iki bayt (0x0c ve 0x0d) MS-DOS 5.0 altında kullanılmaz.
  • Sonraki iki bayt (0x0e ve 0x0f) aşağıdaki gibi oluşturma süresidir:
    • 15 ila 11 arasındaki bitler 24 saatlik biçimde saatlerdir - 00 - 23 arası çıktı
    • 10 ile 5 arasındaki bitler dakikadır - 00 - 59 arası çıktı
    • 4 ile 0 arasındaki bitler, saniye / 2 - çıkış 00 - 58'dir (saniyelerin yalnızca iki saniye çözünürlükte olduğunu unutmayın)
    • Açıklama için: hhhhhmmmmmmsssssbüyük endian yazıldığında.
  • Sonraki iki bayt (0x10 ve 0x11) aşağıdaki gibi oluşturma tarihidir:
    • Bit 15 ila 9 yıl vardır - çıkış 1980 için 0için yukarı 2107 için127
    • 8 ile 5 arasındaki bitler aylardır - 1 ile 12 arası çıktılar (başında sıfır olan veya olmayan)
    • 4 ile 0 arasındaki bitler gündür - 0 ile 31 arası çıktılar (satır başına sıfır olan veya olmayan)
    • Açıklama için: yyyyyyymmmmdddddbüyük endian yazıldığında.
  • Sonraki iki bayt (0x12 ve 0x13) son erişim tarihidir. MS-DOS 5. 0'da kullanıldığında, bu sorun için bu kısmı görmezden geliyoruz.
  • Sonraki iki bayt (0x14 ve 0x15), MS-DOS 5.0 tarafından kullanılmaz.
  • Sonraki iki bayt (0x16 ve 0x17), yukarıdaki oluşturma zamanıyla aynı formatı izleyen en son değiştirilen zamandır.
  • Sonraki iki bayt (0x18 ve 0x19), yukarıdaki oluşturma tarihiyle aynı formatta olan en son değiştirilen tarihtir.
  • Sonraki iki bayt (0x1a ve 0x1b), dosyanın diskteki küme konumudur. Bu kısım için bu kısmı görmezden geliyoruz.
  • Son dört bayt (0x1c, 0x1d, 0x1e ve 0x1f) dosya boyutudur - VL veya SD bayrakları ayarlanmadıkça (yukarıda) belirtilmeyen bir tamsayı olarak çıktı .0

Görsel sunum

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
\______________________________FILENAME________________________________________________/\_ATTR_/\___NOTUSED____/\_CREATIONTIME_/\_CREATIONDATE_/\__LASTACCESS__/\___NOTUSED____/\_MODIFIEDTIME_/\_MODIFIEDDATE_/\___NOTUSED____/\___________FILESIZE___________/

Giriş

  • Hangi formatta uygunsa, tek bir 32 baytlık kelime (yani 256 bit).
    • Bu bir dize 1ve 0birkaç imzasız ints gibi bir Boolean değerleri dizisi vb. Olabilir.
    • Lütfen cevabınızı giriş için hangi formatta kullandığınızı belirtiniz.
    • Sen olamaz yani sürece (yani bir dizi ilgili bayt boyutlarına kırık ön) çoklu giriş almak sadece dil girişini almak için bir yol. Girdiyi ayrıştırmak zorluğun bir parçasıdır.
  • Girişin geçerli olduğunu varsayabilirsiniz (örneğin, tarihin geçerli olduğunu doğrulamak için tarih kontrolü yapmanız gerekmez).
  • Kullanılmayan baytlar , mevcut oldukları sürece hepsi 0, hepsi 1vb. Olabilir . Aşağıdaki örneklerde, hepsini 0kullanılmayan baytlar için kullandım .

Çıktı

Ekrana yazdırılır veya aşağıdakileri döndürür:

  • ASCII dizgisi olarak dosya adı
  • Dosya bir ASCII dizesi olarak nitelendirilir
  • Yaratma zamanı ve yaratma tarihi, uygun ayırıcılarla (iki nokta, eğik çizgiler, bileşenleri ayırt edecek bir şey)
  • Değişik zaman ve uygun tarih, yine uygun ayraçlarla
  • Dosya boyutu

Çıktı, boşlukla ayrılmış veya yeni satırla ayrılmış tek bir dize, bir dizideki ayrı öğeler, vb. Olabilir. Lütfen cevabınızda çıktınızın nasıl biçimlendirildiğini belirtin.

kurallar

  • Standart I / O formatları kabul edilebilir.
  • Tam bir program veya bir işlev kabul edilebilir.
  • Standart boşluklar yasaktır.
  • Bu , yani tüm normal golf kuralları geçerli ve en kısa kod kazanıyor.
  • Tam olarak bu işlevi yerine getiren dahili parçalar yasaktır.

Örnekler

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

Bayrakların çevresinde fazla boşluk varsa sorun olur mu? Örneğin, SD Sgeçerli bir bayrak seti olur mu?
Morgan Thrapp

@ MorganThrapp Elbette, iyi olmalı.
AdmBorkBork

Meraktan, MS-DOS 5.0 ile etkileşime girme konusunda çok fazla tecrübe aldınız mı yoksa bir gün Vikipedi'de gerçekten sıkıldınız mı?
kedi,

3
@ cat İkisinden de bazıları. Yaklaşık 5 yaşımdan beri bilgisayarlarla çok ilgileniyorum ve bir Commodore VIC-20 aldım. Yaklaşık 10 yıl önce bilgisayar seviyesindeki bilgisayar bilimi projelerimden biri kendi dosya sistemimizi kurmaktı, bu yüzden çok araştırdım. Bunun için Wiki'den bir demet topladım ve bunu zor olabilecek bir şeye indirdim.
AdmBorkBork

Yanıtlar:


6

Verilog, 513 670 617 bayt

IVerilog kullanarak çalışır. Özel bir derleme bayrağı gerekmez.

Bu, yuvalanmış tanımların bir canavarı, bit bükme ve endianness nedeniyle bit sırasını çevirmek zorunda kalmanın sıkıntısıdır (aksi halde dize yazdırılmaz veya sayı bit sırası yanlış). Giriş, ibir Verilog modülüne giriş yapmanın normal yolu olan porttan alınır . $displaystandart çıktı almak için kullanılır. Zaman damgası için baştaki sıfırlar gerekmiyorsa 6 bayt kaydedilebilir.

`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

gösteri

Testben (Puansız):

`timescale 1ns / 1ps

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

endmodule

Örnek çalışma:

$ 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 bayt.

19 bayt kurtardı, Cᴏɴᴏʀ O'Bʀɪᴇɴ'a teşekkür ederim, bir harfe fonksiyon atayabileceğimi hatırlattı.

Fry maskesi filtresini temizlemek için FryAmTheEggman'ın önerisi sayesinde 6 bayt kaydedildi.

W0lf'ın harika Ruby cevabı sayesinde 21 bayt kurtardı, beni biraz daha golf oynamaya zorladı. ;)

Bu mutlak bir canavar. Biraz daha kesebileceğimden eminim, ama golf oynamaya çok yaklaşıyor.

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)))

belki intbir karaktere atayabilirsin ? veya belki de gerçekleştiren bir işlev yapar str int.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ İyi fikir!
Morgan Thrapp

Aradaki boşluk or 'SD'kaldırılabilir, sanırım
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Evet, sadece yaptım.
Morgan Thrapp

Vay. Cevapların beklediğimden biraz daha kısa.
AdmBorkBork

4

Haskell, 781 710 bayt

Bazı sadeleştirmeler için BlackCap'e teşekkürler

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

Bu ayrıca, girişten sonra çöpün (yeni satır karakteri gibi) görünmesini sağlar.


Asılı meyvaları biraz
aldım

3

Java, 1721 1587 1573 1560 1511 bayt:

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()));}}

Girdiyi 32 bayt ikili dizge biçiminde alır. Boşluk ayrılmış bir dizge biçiminde çıktı verir. Bu çok çok uzun bir cevap olabilir ama yine de hayal kırıklığına uğradım. Ben sadece bunu Java ile uygulayabildiğim için mutluyum. Yine de bunu yapabildiğim kadar golf oynamaya çalışacağım.

Çevrimiçi Deneyin! (Ideone)


1
+1, çünkü Java'yı düşük seviyeli sorunlar için kullanmak oldukça ironiktir (Haskell'ime çok benziyor)
Fox

2

Ruby, 344 bayt

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))]*' '

Biraz daha okunabilir versiyonu burada mevcuttur .

Çevrimiçi test: http://ideone.com/Fww1Rw


1
Güzel bir! Başka bir 27 byte daha golf oynamam gerek ;)
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]

Daha az golf oynadı

(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
  ]

Ölçek

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>


Tamam, bu yüzden bunu Safari'de yaptım ve anladım Script error.. Ancak Firefox'ta bazı nedenlerden dolayı mükemmel çalışıyor gibi görünüyor. Nedenini merak ediyorum ...
R. Kap

@ R.Kap muhtemelen Safari, Firefox'tan daha az ES6 uyumludur. kangax.github.io/compat-table/es6
edc65

2

PHP ,301 288 bayt

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];

Çevrimiçi deneyin!

Giriş STDIN, çıkış için 32 baytlık bir kelime dizgisidir STDOUT.

-13 bağımsız bir program olarak bayt .


2

Stax , 111 bayt

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

Koş ve hata ayıkla


Hata! Benim hatam. Bir düzeltme yapacağım.
özyinelemeli

1
Şu anda 3 bayt pahasına çalışıyor.
özyinelemeli

1

Perl, 249 bayt

Girdi olarak 32 bayt alır, çıktı yeni satırlarla ayrılır. unpackBu tür ikili yapı ayrıştırma için mükemmel.

($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

Bazı önemli noktalar:

  • Yukarıda belirtilen unpack.
  • Kaplumbağa operatörü @{[]}bir dizgede kodu enterpolasyonuna izin verir. Aslında daha sonra başvurusu kaldırılan bir dizi başvurusu oluşturur.
  • "$str1"x!!$str2boş olmayan bir dize ise döndürmek $str1için güzel bir yoldur $str2.

Aşağıda, küçük-endian alanlarıyla gerçek dizin girişleri üzerinde çalışan ve yalnızca dosya adı ve uzantıdaki sağ dolguyu yok sayarak (örneğin " ppcg", ilk boşlukları kaldırılmadı) (254 bayt) bir sürüm

($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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.