DeflateStream不能与PHP实现处理的缓冲区一起工作
本文关键字:缓冲区 一起 工作 处理 实现 不能 PHP DeflateStream | 更新日期: 2023-09-27 18:10:12
我正在尝试解压缩php deflate实现压缩的缓冲区。下面是代码:
public static void CopyTo(Stream src, Stream dest)
{
byte[] bytes = new byte[4096];
int cnt, i = 0;
while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0 )
{
dest.Write(bytes, 0, cnt);
}
dest.Flush();
}
public static byte[] Unzip(byte[] bytes)
{
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream())
{
using (var gs = new DeflateStream(msi, CompressionMode.Decompress))
{
msi.ReadByte();
msi.ReadByte();
CopyTo(gs, mso);
}
return mso.ToArray();
}
}
正如你注意到的,我正在从源流中读取前2个字节,否则DeflateStream会抛出异常,说无效的块大小。然而,我的问题是,对于某些文件,这段代码工作得很好,但对于其他文件,它给出了损坏的结果(文件只有文件的一部分)。给人的印象是它没有解压缩整个文件)。有人知道是怎么回事吗?
感谢我发现PHP函数用来压缩数据。gzcompress。
你没有说你使用什么php函数,但我猜是gzcompress()
。这将产生zlib格式,这是带有zlib头和尾部的原始deflate格式,而DeflateStream
期望没有头或尾部的原始deflate格式。这就是为什么你必须跳过前两个字节,这是zlib头文件。
PHP函数名很糟糕,容易混淆,文档也没有多大帮助。这里有三种格式:原始deflate, zip-wrapped deflate和zlib-wrapped deflate。所有的PHP函数都以gz
开头,但实际上只有一些函数处理gzip格式。
有时工作,有时不可能是由于行尾或其他文本转换。请确保您正在读取文件中的实际字节,而不会损坏。