我已经用谷歌搜索、维基搜索并阅读了 ZIP 的 RFC,但找不到有关 ZIP 中使用的确切算法的任何信息。
我找到了有关 ZIP == TAR + GZIP 的信息
但是,我对这个信息感到困惑。
由于我记得 GZIP 使用 LZW 算法,而 TAR 使用 LZMA,我无法想象 ZIP == TAR + GZIP (LZMA + LZW - ???)
你能帮我找到 ZIP 的算法吗?我想实现它。
Zip 提供的功能大致相当于 tar 与 gzip 的组合。
tar只是将多个文件一起收集到一个文件中,保留有关原始文件的信息(例如,路径、日期)。与问题中的陈述相反,它本身不进行压缩。
gzip只需要一个文件并压缩它。
Zip做到了这两点——即,它将许多组成文件存储到一个存档中(同样,保留路径、日期等内容),并压缩它们。与 tar + gzip 不同,它单独压缩每个文件,并且不压缩有关组成文件的“目录”信息。这使得处理存档中的单个文件变得容易(插入、删除、解压缩等),但也意味着它通常不会获得整体压缩效果。
与其重新实现 zip 的压缩算法,不如从zlib 网站下载代码(非常便携、非常自由的许可证)几乎肯定会更好。zlib 网站确实对算法有相当合理的解释。如果您真的坚持自己这样做,您可能还想查看RFC 1950、1951和1952。
在这种情况下,“zip”是一种允许多种不同压缩方法的文件格式。它们包括 deflate、deflate64、bzip2、lzma、wavpack 和 ppmd。然而,在实践中,为了兼容性,您几乎总是会看到专门用于 zip 文件的 deflate。
deflate 也是 gzip 和 zlib 以及 png 图像格式使用的压缩方法。
deflate 是 LZ77 压缩机,而不是 LZ78。
tar 是存档器,而不是压缩器。它生成 .tar 文件格式。.tar 文件通常被压缩(方便地由 tar 程序本身调用外部程序),它添加一个后缀,例如用于 gzip 压缩的 .tar.gz。tar 选项包括用于 gzip 的 -z、用于 bzip2 (.bz2) 的 -j 和用于 lzma (.xz) 的 -J。
您不需要实现放气算法。它已经为你完成了。您可以在代码中使用zlib,它具有非常自由的许可证。