有没有人可以建议二进制压缩算法?
Does anyone can suggest binary compression algorithm?
我正在做一个加壳器(运行一次压缩)来研究Windows PE格式文件。我知道一些数据压缩算法,如 RLE、LZW、Huffman-endoing 等。但是哪种算法最适合压缩二进制数据。就像.exe文件?有没有人可以建议哪种压缩二进制数据最好?
对于初学者,您应该从 LZ77 or LZ78 algorithm 开始,它提供了很好的压缩率和一个小的解压存根(显然,一个小的解压存根是打包程序的必备条件)。
LZ7x 算法之后是 LZMA 算法,它提供(通常)比 LZ7x 算法更好的压缩。
如果您以前从未写过加壳程序,我建议您主要使用 PIC (Position Independent Code) 风格的低级语言(C 是事实上的语言)编写解压存根需要时用汇编语言编写的一些小部分。这样做的好处是让编译器为您完成大部分矛盾的事情(至少第 1 点和第 2 点):
- 解压存根代码长度必须最小
- 解压存根代码的速度必须是最优的
- 压缩和解压缩的内存使用必须保持在合理的范围内
然后您可以根据您的方便调整输出程序集,以便在上述两点之间取得良好的 trade-off。
一旦你对压缩理论有了很好的理解,你应该明确地寻求实现一个 PAQ 派生的压缩器。
跟随 PAQ 领导有多个优势:
首先尝试特别关注 PAQ8PX 变体。不过,在生成的压缩 PE 文件中注入最小(长度)和快速解压存根将是这项工作中最困难的部分。
PAQ算法也用在了kkrunchy a well-known PE compressor by the farbrausch demoscene group. A quite good glimpse at its internals is explained here.
最后,如果您不熟悉数据压缩理论,我建议您首先阅读非常好的介绍 Data Compression Explained by Matt Mahoney (author of PAQ) and the wiki book about data compression theory。
请记住,压缩始终是 trade-off:最佳压缩率并不总是 end-users 想要的。如果您需要 256 GB 内存或等待 5 分钟或有 10 MB 字节的解压存根来解压,这显然不是正确的路径...
我正在做一个加壳器(运行一次压缩)来研究Windows PE格式文件。我知道一些数据压缩算法,如 RLE、LZW、Huffman-endoing 等。但是哪种算法最适合压缩二进制数据。就像.exe文件?有没有人可以建议哪种压缩二进制数据最好?
对于初学者,您应该从 LZ77 or LZ78 algorithm 开始,它提供了很好的压缩率和一个小的解压存根(显然,一个小的解压存根是打包程序的必备条件)。
LZ7x 算法之后是 LZMA 算法,它提供(通常)比 LZ7x 算法更好的压缩。
如果您以前从未写过加壳程序,我建议您主要使用 PIC (Position Independent Code) 风格的低级语言(C 是事实上的语言)编写解压存根需要时用汇编语言编写的一些小部分。这样做的好处是让编译器为您完成大部分矛盾的事情(至少第 1 点和第 2 点):
- 解压存根代码长度必须最小
- 解压存根代码的速度必须是最优的
- 压缩和解压缩的内存使用必须保持在合理的范围内
然后您可以根据您的方便调整输出程序集,以便在上述两点之间取得良好的 trade-off。
一旦你对压缩理论有了很好的理解,你应该明确地寻求实现一个 PAQ 派生的压缩器。
跟随 PAQ 领导有多个优势:
首先尝试特别关注 PAQ8PX 变体。不过,在生成的压缩 PE 文件中注入最小(长度)和快速解压存根将是这项工作中最困难的部分。
PAQ算法也用在了kkrunchy a well-known PE compressor by the farbrausch demoscene group. A quite good glimpse at its internals is explained here.
最后,如果您不熟悉数据压缩理论,我建议您首先阅读非常好的介绍 Data Compression Explained by Matt Mahoney (author of PAQ) and the wiki book about data compression theory。
请记住,压缩始终是 trade-off:最佳压缩率并不总是 end-users 想要的。如果您需要 256 GB 内存或等待 5 分钟或有 10 MB 字节的解压存根来解压,这显然不是正确的路径...