Subject : Compress Author : pOiSOn Email : poisone@usa.net Irc : irc.ada.net.tr / #scene.tr #manowar #atheist ICQ : 6795916 LastUpdate : 15 Aralik 98 Note : DOS hicbir zaman olmez! !sAlAM compress..yani sikistirma..hmm.. bilgisayarlar icin kacinilmaz olan sikistirma islemi ne demek ?.. sikistirma islemi herkesin bildigi gibi belli boyuttaki verilen daha az bir bellege getirilmesi..bunu nasil mi yapiliyor ?.. aslinda bilgisayarda gordugunuz tum hersey sayilarla ifade ediliyor.. oynadiginiz oyun..okudugunuz bu yazi..veya movie.. eger bir sey sayilarla ifade edilebiliyorsa o zaman onu sadelestirmek mumkun.. mesela 1000 tane pes pese "A" harfi oldugunu dusunun normalde bu 1000 bytelik yer kaplar biz bunu 1000xA die yazarsak sadece 3 byte tutar..cool hea? :) gelelim konunun ozune .. yontemler ??.. veri sikistirmak icin bir cok yontem var..fakat sikistirma isi en temelde ikiye ayriliyor.. kayipli ve kayipsiz sikistirma.. ilk isimiz veri kayipsiz sikistirma.. veri kaybi olmadan basitce iki yontem var.. biri RLE sikistirma.. digeri LZW sikistirma.. ikisinide anlatiyorum fakat burda asil onemli olan kendi sikistirma yontemlerinizi gelistirmeniz.. RLE ( Run Length Encoding ) bu yontemde ard arda ayni olan bytelarin sayimi esas tutulur.. ornek olarak AABCCCAAAAABBBDDDDDEECBAA (25 byte) seklindeki bir harf dizisi dusunursek 2A1B3C5A3B5D2E1C1B2A (20 byte) || || |^ veri...........|^ veri ^ adet............^ adet || ^^ veri pakedi basit bir yontem ve basit bir sikistirma..neden mi ?.. 255'den fazla ardarda ayni byte olducuna ne olur ?.. bu durumda ikinci bir veri pakedi eklemeniz gerekli.. tahmin ettiginiz gibi bu yontem biraz orani dusuk bir sikistirma.. LZW / huffman teknigi... gunumuzdeki orani en yuksek sikistirma tekniklerinden biri olan LZW ise string mantigi ile calisir... bu mantik tekrar eden byte'lar yerine string leri sayar.. ve bu stringlerin yerine bir isaret koyar.. heralde orneksiz anlasilmasi biraz zor.. :) ABCDEFABCDABCDEFABCABCDABC seklindeki bir veri icindeki stringleri bulursak ABCDEF + ABCD + ABCDEF + ABC + ABCD + ABC her stringin yerine bir sayi veriyorum.. ABCDEF = 1 ( 6 byte ) ABCD = 2 ( 4 byte ) ABC = 3 ( 3 byte ) buna gore biraz onceki dizeyi tekrar yazarsak 121323 ( 6 byte ) artik diziyi 6 byte ile yazabiliyoruz.. diske bu 6 byte'i ve index tablosunu ( 6 + 4 + 3 = 13 byte) yazarsak bunu geri acmayi becerebiliriz :) simdi bi suru sikistirma programi bu LZW teknigine benzer yontemlerle sikistirma yapiyorlar.. peki aralarindaki fark ne ?.. aralarindaki fark stringleri bulma yontemleri.. nasil mi ? biraz onceki index tablosunda ABC karakterleri 3 kez geciyor.. ve bunu bos yere sakliyoruz.. asacidaki gibi bir yontem daha saglam olacak galiba... ABC = 1 (3 byte) ABCD = 1D = 2 (2 byte) ABCDEF = 2EF = 3 (3 byte) 323121 (6 byte) artik 6 byte veri sirasi icin, 7 byte index tablosu icin kullanilacak.. gelelim kayipli sikistirma tekniklerine.. bu teknigin en basta gelen lideri sanirim mpeg.. mpeg teknikleri artik heryerde kullaniliyor.. mp3'ler ve video cd'ler mpeg teknigi ile sikistiriliyor.. basta size akil almaz gibi gelen bu teknicin arkasindaki hile su.. ornegin bir insan yuzunun resmini dusunun.. bu insan yuzunun yan taraflarindaki renk kahverengi'ye sonrada siyah renge dogru gidiyor.. bu renk donmesi sirasindaki cok ufak ayrintilardaki siyah ve kahverengi arasindaki renkleri kaydetmenin manasi yok sanirim .. cunku bu ancak bir mercek ile yaklasip gorebilececiniz oranda ayrintilar.. veya baska bir ornek vermek gerekirse mp3 dosyalari genellikle wav formatindan cevrilerek kaydedilirler.. wav formati kayipsiz bir sikistirmadir ve her turlu ses frekansini kaydeder.. yani siz 10khz altindaki frekanslari duymasaniz bile wav formati bu frekanslari kaydeder.. mp3'e cevrim yapilirken bu insan kulaginin duyamayacagi sesler kirpilir.. buna arti olarak ornek vermek gerekirse iki frekans arasindaki ara frekansi atmak size 1/2 oranda yer kazandirir.. sizin sesi tekrar calarken yapmaniz gereken is ara frekansi hesaplamaktir.. burda onemli bir konu daha var.. matematiksel sonucu onemli olan verileri kayipli sikistirma ile sikistirmaniz basinizi agritir.. neden mi ? bir .exe dosya icerisindeki kod olaninda bir byte'i decistirmeniz exe'nin calismaz hale gelmesine yol acabilir.. bu yuzden ana kural 2+2 = 3.99999 etmesi bazi seyleri degistiriyor ise her zaman 2+2 = 4 olmalidir.. kayipli sikistirma uzerine biraz daha calistiktan sonra bu yaziya eklemeler yapmayi istiyorum.. simdilik bu kadar..