在c#中连接压缩的字节数组

本文关键字:字节 字节数 数组 压缩 连接 | 更新日期: 2023-09-27 18:06:00

我已经压缩了存储在DB中的数据。是否有一种方法可以将50个单独的压缩数据连接到一个可以解压缩的压缩输出中?结果应该与解压缩这50个项目,将它们连接起来,然后压缩它们相同。

我想避免解压阶段。合并已经压缩的数据,而不是压缩整个字节数组,是否也有一些性能上的好处?

在c#中连接压缩的字节数组

我认为仅仅以压缩格式连接任何文件将证明是灾难性的,因为压缩算法已经在每个文件的特定内容上运行。我认为你必须手动解压缩所有,连接,然后再次压缩。

是的,您可以连接gzip流,它在解压缩时给您相同的东西,就好像您已经连接了未压缩的数据并一次压缩了它。具体来说:

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

将给出与

相同的c:
cat a b > c

然而,与一次性压缩整个内容相比,压缩将会降低,特别是如果您的50个片段中的每一个都很小,例如小于10k字节。压缩后的结果总是不同的,根据碎片的大小,会大一点或大一点。

应该注意另一个答案中关于GZIPStream的注释。我还建议您使用DotNetZip。

GZip是有bug的,更不用说解压缩本身有多个GZip成员的GZip文件是有bug的…即使在。net 4.5中,也不是所有的gzip bug都被解决了

进一步考虑每个gzip是在什么机器上创建的,即它是BGZF"Blocked GNU Zip Format"吗?这使手头的问题复杂化了。

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

如果还不算太晚的话,我建议你使用DotNetZip。

GZipStream并不是真正为处理多个文件而构建的,但是你可以使用System.IO.BinaryWriter和System.IO.BinaryReader来获得完全的控制,尽管它可能会变得混乱。DotNetZip只是工作!它被设计用来处理多个文件。

注:GZipStream适用于。net 4中8GB的文件大小,尽管早期版本有一个更低的限制,例如,GZipStream适用于。net 3.5中4GB的文件大小