我正在制作一个打包器(运行时压缩)来研究Windows PE格式文件。我知道一些数据压缩算法,如RLE,LZW,Huffman-endoing等。但哪种算法最适合压缩二进制数据。就像.exe文件一样?有谁能建议压缩二进制数据哪个最好?
答案 0 :(得分:0)
对于启动器,你应该从LZ77 or LZ78 algorithm开始,它提供了相当好的压缩比和一个小的解压缩存根(显然有一个小的解压缩存根是打包器必须具备的。)
遵循LZ7x算法的是LZMA算法,它提供(通常)比LZ7x算法更好的压缩。
如果您之前从未编写过打包程序,我建议您使用PIC(Position Independent Code)样式中的低级语言(C是事实上的语言)编写解压缩存根,并且只是一些小的需要时使用汇编语言编写部件。这样做的好处是让编译器为你完成大部分工作以解决相互矛盾的问题(至少在第1点和第2点):
然后,您可以调整输出装配,以便在上述各点之间进行良好的权衡。
一旦你对压缩理论有了很好的理解,你应该明确地寻求实现一个PAQ派生压缩器。
遵循PAQ主导有很多好处:
特别要特别注意PAQ8PX变体的开始。在生成的压缩PE文件中注入最小(长度)和快速解压缩存根将是该作业中最困难的部分。
PAQ算法也被farbrausch demoscene组用于kkrunchy着名的PE压缩器。其内部的一个很好的一瞥就是explained here。
最后一句话,如果你不习惯数据压缩理论,我建议作为第一读,Matt Mahoney(PAQ的作者)和维基书的非常好的介绍Data Compression Explained关于data compression theory。
请记住,压缩始终是一种权衡:最佳压缩比并不总是最终用户想要的。如果您需要256 GB的内存或等待5分钟或者有一个10 MB字节的解压缩存根来解压缩,这显然不是正确的路径......