gpt4 book ai didi

c# - 将 GZipStream 结果拆分为给定大小的 block 以保持其有效

转载 作者:行者123 更新时间:2023-11-30 21:39:36 24 4
gpt4 key购买 nike

我在 byte[] 中有一堆数据,我使用这样的 GZipStream 压缩它。

byte[] input = ...;

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

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

如果我只是拆分结果 byte[], block 将不再形成有效的 GZip 存档,所以这不是一个好方法。

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

如何在将每个 block 保存为有效的 GZip 存档的同时做到这一点?

最佳答案

没有一种有效的方法来执行此操作,因为您无法在不压缩的情况下预测压缩输出的大小。 (除非你没有压缩和一些只有存储 block 的扩展,但我假设你需要压缩。)

可以看看this example了解如何以固定 block 大小获得尽可能多的压缩数据。它为每个 block 执行三个压缩 channel 以进行拟合。它会对压缩数据进行两次解压缩,以估计适合的未压缩数据量,然后重新压缩该猜测。

您不能保证压缩后的数据完全适合您的 block 大小,因为添加一个未压缩的字节可能会添加两个压缩的字节,直接跳过您的确切 block 大小。然而,对于 gzip 格式,您可以欺骗并在 header 中添加垃圾字节以将其填充到准确的数量。

关于c# - 将 GZipStream 结果拆分为给定大小的 block 以保持其有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45129657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com