【发布时间】:2016-01-02 06:55:41
【问题描述】:
我正在制作一个打包程序(运行时压缩)来研究 Windows PE 格式文件。我知道一些数据压缩算法,例如 RLE、LZW、Huffman-endoing 等。但是哪种算法最好压缩二进制数据。就像 .exe 文件一样?有没有人可以建议哪个是最好的压缩二进制数据?
【问题讨论】:
标签: binary compression portable-executable
我正在制作一个打包程序(运行时压缩)来研究 Windows PE 格式文件。我知道一些数据压缩算法,例如 RLE、LZW、Huffman-endoing 等。但是哪种算法最好压缩二进制数据。就像 .exe 文件一样?有没有人可以建议哪个是最好的压缩二进制数据?
【问题讨论】:
标签: binary compression portable-executable
对于初学者,您应该从 LZ77 or LZ78 algorithm 开始,它提供了相当好的压缩比和一个小的解压存根(显然,一个小的解压存根是打包程序必须具备的)。
在 LZ7x 算法之后是 LZMA 算法,它提供(通常)比 LZ7x 算法更好的压缩。
如果您以前从未编写过打包程序,我建议您主要使用 PIC (Position Independent Code) 样式的低级语言(C 是事实上的语言)编写解压存根,仅使用其中的一些小部分需要时使用汇编语言。这样做的好处是让编译器为您完成大部分工作以处理矛盾的事情(至少第 1 点和第 2 点):
然后,您可以根据自己的方便调整输出程序集,以便在上述各点之间取得良好的折衷。
一旦你对压缩理论有了很好的理解,你应该明确地寻求实现一个PAQ派生的压缩器。
遵循 PAQ 引导有多种优势:
首先尝试特别关注 PAQ8PX 变体。不过,在生成的压缩 PE 文件中注入最小(长度)和快速解压缩存根将是这项工作中最困难的部分。
PAQ 算法也用于kkrunchy farbrausch demoscene 组著名的 PE 压缩器。 explained here.
最后,如果您不习惯数据压缩理论,我建议您先阅读一下 Matt Mahoney(PAQ 的作者)的非常好的介绍 Data Compression Explained 和关于 data compression theory 的 wiki 书籍.
请记住,压缩始终是一种权衡:最佳压缩率并不总是最终用户想要的。如果您需要 256 GB 内存或等待 5 分钟或有一个 10 MB 字节的解压存根来解压,这显然不是正确的路径...
【讨论】: