【问题标题】:Does anyone can suggest binary compression algorithm?有人可以建议二进制压缩算法吗?
【发布时间】:2016-01-02 06:55:41
【问题描述】:

我正在制作一个打包程序(运行时压缩)来研究 Windows PE 格式文件。我知道一些数据压缩算法,例如 RLE、LZW、Huffman-endoing 等。但是哪种算法最好压缩二进制数据。就像 .exe 文件一样?有没有人可以建议哪个是最好的压缩二进制数据?

【问题讨论】:

    标签: binary compression portable-executable


    【解决方案1】:

    对于初学者,您应该从 LZ77 or LZ78 algorithm 开始,它提供了相当好的压缩比和一个小的解压存根(显然,一个小的解压存根是打包程序必须具备的)。

    在 LZ7x 算法之后是 LZMA 算法,它提供(通常)比 LZ7x 算法更好的压缩。

    如果您以前从未编写过打包程序,我建议您主要使用 PIC (Position Independent Code) 样式的低级语言(C 是事实上的语言)编写解压存根,仅使用其中的一些小部分需要时使用汇编语言。这样做的好处是让编译器为您完成大部分工作以处理矛盾的事情(至少第 1 点和第 2 点):

    1. 解压存根代码长度必须最小
    2. 解压存根代码的速度必须是最优的
    3. 压缩和解压缩的内存使用必须保持在合理的范围内

    然后,您可以根据自己的方便调整输出程序集,以便在上述各点之间取得良好的折衷。


    一旦你对压缩理论有了很好的理解,你应该明确地寻求实现一个PAQ派生的压缩器。

    遵循 PAQ 引导有多种优势:

    • 众所周知,它是多个领域(文本、图像 和可执行的,虽然每次都有不同的建模上下文)。查看各种基准测试herehere

    • 它是开源的(并遵循 GPL 许可)。

    首先尝试特别关注 PAQ8PX 变体。不过,在生成的压缩 PE 文件中注入最小(长度)和快速解压缩存根将是这项工作中最困难的部分。

    PAQ 算法也用于kkrunchy farbrausch demoscene 组著名的 PE 压缩器。 explained here.


    最后,如果您不习惯数据压缩理论,我建议您先阅读一下 Matt Mahoney(PAQ 的作者)的非常好的介绍 Data Compression Explained 和关于 data compression theory 的 wiki 书籍.

    请记住,压缩始终是一种权衡:最佳压缩率并不总是最终用户想要的。如果您需要 256 GB 内存或等待 5 分钟或有一个 10 MB 字节的解压存根来解压,这显然不是正确的路径...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多