使用 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 限制的主要内容,如果未能解决你的问题,请参考以下文章