0

我正在尝试解压缩由 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

4

1 回答 1

1

你没有说你使用了什么 php 函数,但我猜gzcompress(). 这会产生 zlib 格式,它是带有 zlib 标头和预告片的原始 deflate 格式,而DeflateStream预期的是没有标头或预告片的原始 deflate。这就是为什么您必须跳过前两个字节,即 zlib 标头。

PHP 函数名称很糟糕且令人困惑,文档也没有多大帮助。这里使用了三种格式:原始 deflate、gzip-wrapped deflate 和 zlib-wrapped deflate。所有的 PHP 函数都以 gzip 格式开始,gz但只有其中一些函数真正处理 gzip 格式。

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

于 2013-04-20T16:40:43.940 回答