我正在尝试编写 zipstream 压缩工具,例如从第 3 方服务获取数据,对其进行转换、压缩,然后将这些字节添加到 zip 存档字节流中并发送到另一个服务。
Crc32 在每个块之后重新计算。
制作了第 3 方服务模拟 - 按块读取文件。
这个版本有效,但解压后我得到空文件。但它不是空的 - 我在十六进制编辑器中看到数据。我认为 crc32 有问题。
但如果我一次压缩整个文件,它就可以正常工作。
这是我的问题。
是否可以使用 deflatestream 按块压缩大量数据?
稍后我需要使用常规 zip 工具提取这些数据。
public async Task<byte[]> Compress(string fileName, IAsyncEnumerable<byte[]> data)
{
var crc32Helper = new System.IO.Hashing.Crc32();
var lfh = ZipTools.GetLocalFileHeaderEntry(fileName);
testResult.AddRange(lfh);
var bytearray = new List<byte>();
await foreach (var chunk in data)
{
_originalSize += (ulong) chunk.Length;
var compressedData = Compress(chunk);
_compressedSize += (ulong) compressedData.Length;
crc32Helper.Append(chunk);
testResult.AddRange(compressedData);
}
_originalSize += (ulong) bytearray.Count;
_crc32 = crc32Helper.GetCurrentHashAsUInt32();
var cd = ZipTools.GetCentralDirectoryEntry(
fileName,
_crc32,
(ulong) lfh.Length + _compressedSize,
_compressedSize,
_originalSize);
testResult.AddRange(cd);
return testResult.ToArray();
}
public byte[] Compress(byte[] data)
{
using var input = new MemoryStream(data);
using var resultStream = new MemoryStream();
using (DeflateStream compressionStream = new DeflateStream(resultStream, CompressionMode.Compress))
{
input.CopyTo(compressionStream);
}
return resultStream.ToArray();
}
您可以尝试调整 zipflow 中的 C 代码以在您的 C# 应用程序中使用。 zipflow 接收数据块并输出 zip 文件,而无需将任何条目的完整输入或输出 zip 文件保留在内存或文件系统中。
我不知道“ZipTools”是什么,也找不到它。但是,将多个 deflate 流写入单个条目将不起作用。它必须是单个放气流。此外,没有证据表明写入了中央目录结束记录,该记录必须遵循中央目录。