将GZipStream结果拆分为给定大小的块,使其保持有效

时间:2017-07-16 14:25:15

标签: c# gzip gzipstream

我在byte[]中有大量数据,我使用这样的GZipStream进行压缩。

byte[] input = ...;

var zipped = new MemoryStream();
using (var zipper = new GZipStream(zipped, CompressionMode.Compress, true)) {
  zipper.Write(input, 0, input.Length);
}

由于我的技术要求,我需要将结果拆分为 - 例如 - 50k块,以便每个块都可以解压缩并恢复原始数据的相应块。

如果我只是拆分结果byte[],那么这些块将不再形成有效的GZip存档,因此这不是一个好方法。

我既不能使用某种循环来停止对块大小的压缩,因为GZipStream不能报告压缩数据的当前长度。当我关闭压缩流时,我只得到Length,但之后我已经有了一个有效的存档,所以我不能从那里继续。

如何在将每个块保留为有效的GZip存档的同时执行此操作?

1 个答案:

答案 0 :(得分:3)

没有一种有效的方法可以做到这一点,因为您无法在不压缩的情况下预测压缩输出的大小。 (除非你没有压缩和只有存储块的扩展,但我假设你需要压缩。)

您可以查看this example,了解如何以尽可能多的固定块大小获取压缩数据。它为每个块执行三次压缩传递以进行拟合。它对压缩数据进行两次解压缩,以估计适合的未压缩数据量,并重新压缩猜测。

您无法确保压缩数据完全符合您的块大小,因为添加一个未压缩字节可能会添加两个压缩字节,跳过正确的块大小。但是使用gzip格式,您可以在标题中作弊并添加垃圾字节,以将其填充到准确的数量。