在C#中连接gzip压缩字节数组

时间:2013-03-27 10:14:08

标签: c# gzip compression gzipstream

我有压缩存储在数据库中的数据。 有没有办法连接50个单独的gzip压缩数据到一个可以解压缩的gzip压缩输出?结果应该与解压缩50个项目,连接它们然后gzipping它们相同。

我想避免减压阶段。 合并已经压缩的数据而不是gzipping整个字节数组也有一些性能优势吗?

3 个答案:

答案 0 :(得分:2)

我认为仅仅以压缩格式连接任何文件都会带来灾难性,因为已经对每个文件的特定内容运行了压缩算法。我认为你必须手动解压缩所有,连接,然后再拉链。

答案 1 :(得分:1)

是的,你可以连接gzip流,它们在解压缩时会给你一样的东西,就好像你已经连接了未压缩的数据并一次gzip一样。具体做法是:

gzip a
gzip b
cat a.gz b.gz > c.gz
gunzip c.gz

将为您提供相同的c

cat a b > c

然而,与一次性压缩整个物体相比,压缩会降低,特别是如果您的50件中的每一件都很小,例如少于10个K字节。压缩的结果总是不同的,根据碎片的大小,有点或者更大。

应该注意关于GZIPStream的另一个答案中的评论。我还建议你改用DotNetZip

答案 2 :(得分:0)

GZip是错误的,更多的解压缩gzip文件本身有多个gzip成员是错误的...并非所有的gzips错误都被解决了,即使在.net 4.5

此外,考虑每个gzip创建的机器,即它是BGZF“Blocked GNU Zip Format”吗?这使问题变得复杂。

此外,生成的gzip文件可能比将所有未压缩的单个文件连接在一起时更大(gzip不是一个非常好的压缩算法集)。

我建议您使用DotNetZip代替,如果还不晚。

GZipStream实际上并不是为处理多个文件而构建的,但是你可以使用System.IO.BinaryWriter和System.IO.BinaryReader获得完全控制,尽管它可能会变得混乱。 DotNetZip正常运作!它旨在处理多个文件。

P.S。 GZipStream适用于.Net 4的文件大小高达8GB,尽管早期版本有一个下限,例如GZipStream适用于.Net 3.5

的文件大小高达4GB