一尘不染

将多个zlib压缩数据流有效地连接到单个流中

python

如果我有几个带有压缩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!

我想要的例子:

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!

我对zlib和DEFLATE算法了解不多,因此从理论上讲这可能是完全不可能的。另外,我必须使用use zlib;
因此我无法包装zlib并提出自己的协议,该协议透明地处理级联流。

注意:我不介意该解决方案在Python中不是很简单。我愿意编写一些C代码并在Python中使用ctypes。


阅读 309

收藏
2021-01-20

共1个答案

一尘不染

由于您不介意使用C,因此可以从查看
gzjoin 的代码
开始

请注意, gzjoin 代码必须解压缩以查找合并时必须更改的部分,但不必重新压缩。这还不错,因为解压缩通常比压缩快。

2021-01-20