Алгоритмы сжатия GPcH (admin@dotfix.net) Спецвыпуск: Хакер, номер #062, стр. 062-062-5 www.ibsensoftware.com — сайт авторов aplib. здесь можно скаЧать библиотеку или сорцы депакера. также имеетсЯ возможность купить aplib длЯ коммерЧеской эксплуатации, правда, за $29. http://en.wikipedia.org — простаЯ энциклопедиЯ, несмотрЯ на это именно в ней оЧень подробно рассмотрены многие алгоритмы сжатиЯ, рассказано об авторах, даны архиполезные перекрестные ссылки на описание разлиЧных технологий, используемых при построении того или иного алгоритма. кстати, вот ссылка на описание алгоритмов: http://en.wikipedia.org/wiki/category:lossless_compression_algorithms. сайты популЯрных архиваторов: www.powerarchiver.com — довольно мощный пакер. сжимает в формате 7zip. платный — стоит около $20. www.izarc.org — наконец-то! единственный путевый пакер, который можно полуЧить абсолютно бесплатно. плюс имеетсЯ поддержка таких форматов, как 7-zip, a, ace, arc, arj, b64, bh, bin, bz2, bza, c2d, cab, cdi, cpio, deb, enc, gca, gz, gza, ha, img, iso, jar, lha, lib, lzh, mdf, mbf, mim, nrg, pak, pdi, pk3, rar, rpm, tar, taz, tbz, tgz, tz, uue, war, xxe, yz1, z, zip, zoo. впеЧатлЯет? Распаковщик aplib на С: как все просто unsigned int aP_depack(unsigned char *source, unsigned char *destination) { unsigned int offs, len, R0, LWM; int done; int i; aP_d_input = source; aP_d_output = destination; LWM = 0; aP_d_tagpos = 0; *aP_d_output = *aP_d_input; aP_d_output++; aP_d_input++; done = 0; while (!done) { if (aP_d_getbit()) { if (aP_d_getbit()) { if (aP_d_getbit()) { offs = 0; for (i = 4; i; i--) offs = (offs << 1) + aP_d_getbit(); if (offs) { *aP_d_output = *(aP_d_output - offs); aP_d_output++; } else { *aP_d_output = 0x00; aP_d_output++; } LWM = 0; } else { offs = *aP_d_input; aP_d_input++; len = 2 + (offs & 0x0001); offs >>= 1; if (offs) { for (; len; len--) { *aP_d_output = *(aP_d_output - offs); aP_d_output++; } } else done = 1; R0 = offs; LWM = 1; } } else { offs = aP_d_getgamma(); if ((LWM == 0) && (offs == 2)) { offs = R0; len = aP_d_getgamma(); for (; len; len--) { *aP_d_output = *(aP_d_output - offs); aP_d_output++; } } else { if (LWM == 0) offs -= 3; else offs -= 2; offs <<= 8; offs += *aP_d_input; aP_d_input++; len = aP_d_getgamma(); if (offs >= 32000) len++; if (offs >= 1280) len++; if (offs < 128) len += 2; for (; len; len--) { *aP_d_output = *(aP_d_output - offs); aP_d_output++; } R0 = offs; } LWM = 1; } } else { *aP_d_output = *aP_d_input; aP_d_output++; aP_d_input++; LWM = 0; } } return (aP_d_output - destination); } Одна из реализаций метода Хаффмана от VVS Soft Group. Полный исходник — на CD procedure PakOneByte; { --- сжатие и пересылка в выходной буфер одного байта --- } Var Mask : word; Tail : boolean; begin CRC:=CRC XOR InBuf[InCounter]; Mask:=CodeTable[InBuf[InCounter]]^.BiteChain SHR CounterBite; OutWord:=OutWord OR Mask; |