C# DeflateStream无法使用从PHP实现处理的缓冲区

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

我正在尝试解压缩由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函数用于压缩数据。是的。

你没有说你使用了什么php函数,但我猜是
gzcompress()
。这将生成zlib格式,该格式是原始deflate格式,带有zlib头和尾部,而
DeflateStream
期望原始deflate没有头或尾部。这就是为什么必须跳过前两个字节,即zlib头

PHP函数名既糟糕又混乱,文档也帮不了什么忙。这里有三种格式:原始deflate、gzip包装deflate和zlib包装deflate。所有的PHP函数都以
gz
开头,但实际上只有一些函数处理gzip格式


有时工作,有时不工作可能是由于行尾或其他文本转换。确保您读取的是文件中的实际字节,没有损坏。

老实说,这听起来很可能是PHP方面的问题。谢谢@Mark,我已经检查过了,在任何解压缩之前,我正在读取实际数据。您是如何获得数据的?它可能在早些时候被损坏了。