如何连接两个或多个gzip文件/流

Art*_*yom 13 c++ gzip concatenation

我想连接两个或更多gzip流而不重新压缩它们.

我的意思是我将A压缩为A.gz,B压缩为B.gz,我想将它们压缩为单个gzip(A + B).gz而不再使用C或C++进行压缩.

几点说明:

  • 即使你只能连接两个文件,gunzip会知道如何处理它们,大多数程序都无法处理两个块.
  • 我曾经看过一个代码示例,只是通过解压缩文件然后操作原始文件,这比正常的重新压缩要快得多,但仍然需要O(n)CPU操作.
  • 不幸的是,我找不到我曾经发现的这个例子(仅使用解压缩连接),如果有人可以指出它我会很高兴.

注意:它与不重复,因为建议的解决方案不符合我的需要.

清除编辑:

我想连接几个压缩的HTML pices,并根据请求将它们作为一个页面发送到浏览器:"Accept-Encoding:gzip",带有respnse"Content-Encoding:gzip"

如果流的简单结合cat a.gz b.gz >ab.gz,Gecko(firefox)和KHTML Web引擎只获得第一部分(a); IE6没有显示任何内容,Google Chrome正确显示第一部分(a),第二部分(b)显示为垃圾(根本不解压缩).

只有Opera处理得这么好.

所以,我需要创建一个单一的几个块的gzip流,而不需要重新压缩发送.

更新:我在zlib的例子中找到了gzjoin.c,它只使用解压缩.问题是减压仍然比较简单memcpy.

它仍然比最快的gzip压缩快4倍.但这还不够.

我需要的是找到我需要与gzip文件一起保存的数据,以便不运行解压缩过程,以及如何在压缩过程中找到这些数据.

APr*_*mer 12

查看RFC1951RFC1952

格式只是一个成员套件,每个成员由三部分组成,标题,数据和预告片.数据部分本身是一组块,每个块具有头部和数据部分.

为了模拟gzip压缩的两个(或多个文件)的连接结果的影响,你只需要调整头(没有例如最后一块标志)和拖车正确,复制数据部分.

有一个问题,预告片有未压缩数据的CRC32,当你知道部件的CRC时,我不确定这个是否容易计算.

编辑:您发现gzjoin.c文件中的注释意味着,虽然可以在不解压缩数据的情况下计算CRC32,但还有其他需要解压缩的东西.


Jua*_*uan 6

gzip手册说,可以在尝试时连接两个gzip文件.

http://www.gnu.org/software/gzip/manual/gzip.html#Advanced-usage

所以似乎其他工具可能会被打破.如此错误报告中所示. http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=97263

除了向每个浏览器制造商提交错误报告,并希望它们符合要求之外,也许您的程序可以缓存所需数据的最常见连接.

正如其他人所说,您可以进行手术:http: //www.gzip.org/zlib/rfc-gzip.html

这需要最终未压缩文件的CRC-32.通过添加各个子文件的长度,可以轻松计算未压缩文件的所需大小.

在最后一个链接的底部,有一些代码用于计算名为update_crc的运行crc-32.

每次运行进程时计算未压缩文件的crc,可能比gzip算法本身便宜.