使用 zlib 解压缩文件 - 卡在 256kb 限制

Posted

技术标签:

【中文标题】使用 zlib 解压缩文件 - 卡在 256kb 限制【英文标题】:Decompress file using zlib - stuck at 256kb limit 【发布时间】:2017-11-03 22:02:41 【问题描述】:

我希望这里的人能够帮助我解决这个问题。 我要做的是使用ZlibNet 解压缩C# 中的zlib 压缩文件。 (我也试过DotNetZip和SharpZipLib)

我遇到的问题是它只会解压缩前 256kb,或者更确切地说是前 262144 个字节。 这是我的解压方法,取自here:

public static byte[] Decompress(byte[] gzip)
    
        using (var stream = new Ionic.Zlib.ZlibStream(new MemoryStream(gzip), Ionic.Zlib.CompressionMode.Decompress))
        
            var outStream = new MemoryStream();
            const int size = 999999; //Playing around with various sizes didn't help
            byte[] buffer = new byte[size];

            int read;
            while ((read = stream.Read(buffer, 0, size)) > 0)
            
                outStream.Write(buffer, 0, read);
                read = 0;
            

            return outStream.ToArray();
        
    

基本上,int(读取)在第一次执行 while 循环时被设置为 262144,它写入,然后在 while 循环的下一次循环中,read 被设置为 0,从而使循环退出和函数将 outStream 作为数组返回。 (即使还有字节要读取!)

提前感谢任何可以提供帮助的人!

【问题讨论】:

你试过了吗?删除 read = 0; 或将缓冲区设置为 10 个字节? 我有,但结果保持不变——结果文件只有 262144 字节大。 你确定gzip数组是正确的? 我在调试模式下查看了加载的数据,它似乎都在那里——这个函数对于任何小于 262144 字节的文件也可以完美地工作。 执行此操作var gzipStream = new MemoryStream(gzip); 并在您的 ZlibStream 中使用它。在您的方法结束时检查gzipStream.Position == gzip.length 【参考方案1】:

在进一步检查原始打包数据后,原来负责(解)压缩原始应用程序中的数据的脚本会将文件的 zlib 流拆分为每个 262144 字节的块。

这就是我测试的各种库总是停在 262144 字节的原因——它是 zlib 流的结尾,而不是它应该提取的文件的结尾。 (每个 zlib 流也由一个 32 位无符号整数分隔,表示下一个 zlib 流将包含的字节数)

我唯一的猜测是他们这样做是为了如果他们有一个非常大的文件,他们就不需要将所有文件加载到内存中进行解压缩。 (但这只是猜测。)

【讨论】:

以上是关于使用 zlib 解压缩文件 - 卡在 256kb 限制的主要内容,如果未能解决你的问题,请参考以下文章

zlib gunzip解压缩每个在同一文件上运行的不同缓冲区大小

Python zlib 解压缩 gzipped 数据

java 如何用zlib解压缩tar.gz文件

C/C++ 自制一个基于zlib的文件的(解)压缩系统

Ruby zlib 库解压 gzip 文件非常慢

使用 zlib+dictionary 压缩/解压缩 spdy 名称/值块时出错