C# DeflateStream无法使用从PHP实现处理的缓冲区
我正在尝试解压缩由php deflate实现压缩的缓冲区。代码如下:C# DeflateStream无法使用从PHP实现处理的缓冲区,c#,.net,compression,deflate,C#,.net,Compression,Deflate,我正在尝试解压缩由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
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函数用于压缩数据。是的。你没有说你使用了什么php函数,但我猜是
gzcompress()
。这将生成zlib格式,该格式是原始deflate格式,带有zlib头和尾部,而DeflateStream
期望原始deflate没有头或尾部。这就是为什么必须跳过前两个字节,即zlib头
PHP函数名既糟糕又混乱,文档也帮不了什么忙。这里有三种格式:原始deflate、gzip包装deflate和zlib包装deflate。所有的PHP函数都以gz
开头,但实际上只有一些函数处理gzip格式
有时工作,有时不工作可能是由于行尾或其他文本转换。确保您读取的是文件中的实际字节,没有损坏。老实说,这听起来很可能是PHP方面的问题。谢谢@Mark,我已经检查过了,在任何解压缩之前,我正在读取实际数据。您是如何获得数据的?它可能在早些时候被损坏了。