如果我有几个带有压缩 zlib 数据的二进制字符串,有没有办法有效地将它们组合成一个压缩字符串而不解压缩所有内容?
我现在必须做的示例:
c1 = zlib.compress("The quick brown fox jumped over the lazy dog. ")
c2 = zlib.compress("We ride at dawn! ")
c = zlib.compress(zlib.decompress(c1)+zlib.decompress(c2)) # Warning: Inefficient!
d1 = zlib.decompress(c1)
d2 = zlib.decompress(c2)
d = zlib.decompress(c)
assert d1+d2 == d # This will pass!
Run Code Online (Sandbox Code Playgroud)
我想要的例子:
c1 = zlib.compress("The quick brown fox jumped over the lazy dog. ")
c2 = zlib.compress("We ride at dawn! ")
c = magic_zlib_add(c1+c2) # Magical method of combining compressed streams
d1 = zlib.decompress(c1)
d2 = zlib.decompress(c2)
d = zlib.decompress(c)
assert d1+d2 == d # This should pass!
Run Code Online (Sandbox Code Playgroud)
我对 zlib 和 DEFLATE 算法不太了解,所以从理论的角度来看,这可能是完全不可能的。另外,我必须使用 use zlib;所以我不能包装 zlib 并提出我自己的协议来透明地处理连接流。
注意:如果解决方案在 Python 中不是微不足道的,我并不介意。我愿意编写一些 C 代码并在 Python 中使用 ctypes。
由于您不介意冒险使用 C,您可以从查看gzjoin的代码开始。
请注意,gzjoin代码必须解压缩才能找到合并时必须更改的部分,但不必重新压缩。这还不错,因为解压通常比压缩快。
除了需要解压第一个 deflate 流的 gzjoin 之外,您还可以查看gzlog.h和gzlog.c,它们可以有效地将短字符串附加到 gzip 文件中,而无需每次都解压 deflate 流。(它可以很容易地修改为对 zlib 包装的 deflate 数据而不是 gzip 包装的 deflate 数据进行操作。)如果您可以控制第一个 deflate 流的创建,则可以使用这种方法。如果您不是创建第一个 deflate 流,那么您将不得不使用需要解压缩的 gzjoin 方法。
没有一种方法需要重新压缩。