【发布时间】:2010-11-11 17:04:45
【问题描述】:
我想连接两个或多个 gzip 流而不重新压缩它们。
我的意思是我将 A 压缩为 A.gz,将 B 压缩为 B.gz,我想使用 C 或 C++ 将它们压缩为单个 gzip (A+B).gz 而无需再次压缩。
几个注意事项:
- 即使您可以连接两个文件,而 gunzip 知道如何处理它们,大多数程序也无法处理两个块。
- 我曾经见过一个代码示例,该示例仅通过解压缩文件然后操作原始文件来执行此操作,这比正常重新压缩要快得多,但仍需要 O(n) CPU 操作。
- 不幸的是,我找不到这个我曾经找到过的示例(仅使用解压缩进行连接),如果有人能指出它,我会很感激。
注意:它不是 this 的重复,因为建议的解决方案不符合我的需要。
澄清编辑:
我想连接几个压缩的 HTML pices 并将它们作为一个页面发送到浏览器,根据请求:“Accept-Encoding: gzip”,响应为“Content-Encoding: gzip”
如果像cat a.gz b.gz >ab.gz 那样简单地连接流,Gecko (firefox) 和 KHTML 网络引擎只会得到第一部分 (a); IE6 不显示任何内容,Google Chrome 将第一部分 (a) 正确显示,将第二部分 (b) 显示为垃圾(根本不解压缩)。
只有 Opera 能很好地处理这个问题。
所以我需要创建一个包含多个块的单个 gzip 流,并在不重新压缩的情况下发送它们。
更新: 我在 zlib 的示例中找到了 gzjoin.c,它只使用解压缩来完成。问题是解压还是比较慢他们简单memcpy.
它仍然比最快的 gzip 压缩快 4 倍。但这还不够。
我需要的是找到我需要与 gzip 文件一起保存的数据,以便 没有运行解压程序,如何在压缩过程中找到这些数据。
【问题讨论】:
-
您真的要压缩它们还是只是将它们连接到同一个文件中?
-
我想创建一个由另外两个 gzip 压缩文件/流/内存块组成的 gzip 压缩文件/流/内存块,而无需解压缩、连接它们并再次压缩它们。
-
在编辑中查看说明。
-
gzjoin.c 需要解压第二个流以与流保持同步。由于 zlib 流不包含索引,因此这是必需的。理论上你可以提前gzip压缩的时候加上索引,修改gzjoin来使用这个索引。但这不适合胆小的人......
-
如果你把这个写成答案,我可以接受。
标签: c++ gzip concatenation