在c#中连接压缩的字节数组
本文关键字:字节 字节数 数组 压缩 连接 | 更新日期: 2023-09-27 18:06:00
我已经压缩了存储在DB中的数据。是否有一种方法可以将50个单独的压缩数据连接到一个可以解压缩的压缩输出中?结果应该与解压缩这50个项目,将它们连接起来,然后压缩它们相同。
我想避免解压阶段。合并已经压缩的数据,而不是压缩整个字节数组,是否也有一些性能上的好处?
我认为仅仅以压缩格式连接任何文件将证明是灾难性的,因为压缩算法已经在每个文件的特定内容上运行。我认为你必须手动解压缩所有,连接,然后再次压缩。
是的,您可以连接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的文件大小