You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中实现内存缓冲区到ZIP格式内存缓冲区的压缩?

内存中压缩字节缓冲区为ZIP格式的实现

你完全可以用System.IO.Compress.ZipArchive在内存中完成压缩,不需要涉及文件操作——它本质上是基于Stream工作的,文件流只是其中一种场景。核心是用MemoryStream替代文件流来承载输入输出数据。

以下是完整的C#实现代码:

using System.IO;
using System.IO.Compression;

public byte[] CompressToZipInMemory(byte[] inputBuffer)
{
    // 创建内存流存储压缩后的ZIP数据
    using (var outputStream = new MemoryStream())
    {
        // 打开ZipArchive,设置leaveOpen=true,确保ZipArchive释放后输出流仍可读取
        using (var archive = new ZipArchive(outputStream, ZipArchiveMode.Create, leaveOpen: true))
        {
            // 在ZIP中创建一个条目(名称可自定义,单片机解压时需要对应这个名称提取数据)
            var entry = archive.CreateEntry("data.bin", CompressionLevel.Optimal);
            
            // 将输入缓冲区写入到ZIP条目中
            using (var entryStream = entry.Open())
            {
                entryStream.Write(inputBuffer, 0, inputBuffer.Length);
            }
        }
        
        // 将内存流指针复位到起始位置,然后转换为字节数组
        outputStream.Position = 0;
        return outputStream.ToArray();
    }
}

关键细节说明

  • leaveOpen: true:默认情况下,ZipArchive销毁时会关闭关联的流。设置这个参数可以让我们在ZipArchive释放后,继续读取MemoryStream中的压缩数据。
  • ZIP条目名称:示例中用了data.bin,你可以根据单片机的解压逻辑自定义名称——单片机需要通过这个名称定位到ZIP包内的目标数据。
  • 压缩级别:CompressionLevel.Optimal是平衡压缩率和速度的选项,你也可以根据需求换成Fastest(速度优先)或NoCompression(仅打包不压缩)。

额外提示

  • 如果你的输入缓冲区本身已经是高压缩率的数据(比如已压缩的二进制),压缩后可能不会变小,甚至略微增大,建议在发送前对比原数据和压缩后数据的大小,选择更小的那个发送。
  • 单片机端需要支持读取ZIP包内的单个文件条目,确保其解压逻辑能正确识别你设置的条目名称。

内容的提问来源于stack exchange,提问作者David La

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:20:21