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。

DeflateStream不能与PHP实现处理的缓冲区一起工作

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

PHP函数名很糟糕,容易混淆,文档也没有多大帮助。这里有三种格式:原始deflate, zip-wrapped deflate和zlib-wrapped deflate。所有的PHP函数都以gz开头,但实际上只有一些函数处理gzip格式。

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