C# - GZipStream幻数不正确?

时间:2014-01-25 09:39:34

标签: c# sockets gzipstream deflatestream

所以,我正在尝试制作一个程序,将计算机变成代理using this。这一切都运行良好,除了gzip / deflate页面。

每当我尝试解压缩时,我都会收到一个InvalidDataException,指出GzipHeader中的幻数不正确。

我使用这个功能:

private byte[] GZipUncompress(byte[] data)
{
    using (var input = new MemoryStream(data))
    {
        input.Seek(0, SeekOrigin.Begin);

        using (var gzip = new GZipStream(input, CompressionMode.Decompress))
        using (var output = new MemoryStream())
        {
            output.Seek(0, SeekOrigin.Begin);
            gzip.CopyTo(output);

            return output.ToArray();
        }
    }
}

解压缩数据。错误:

error http://gyazo.com/c59de705a264cda47d670ae9b03dfa39.png

任何帮助都将不胜感激。

编辑:我似乎已经到了某个地方!

正如我们建议的那样,我应该编写一个HTTP解析器来获取正文并解压缩。

解析之前:http://pastebin.com/Cb0E8WtT

解析后:http://pastebin.com/k9e8wMvr

这是我用来到身体的方法:

    private byte[] HTTParse(byte[] data)
    {
        string http = ascii.GetString(data);
        char[] lineBreak = crlf.ToCharArray();
        string[] parts = http.Split(lineBreak);

        List<byte> res = new List<byte>();

        for (int i = 1; i < parts.Length; i++)
        {
            if (i % 2 == 0)
            {
                Regex r = new Regex(@"(.)*: (.)*");
                Regex htt = new Regex(@"HTT(.)*/(.)*.(.)* d{1,50} (.)*");
                if (!r.IsMatch(parts[i]) && !htt.IsMatch(parts[i]))
                {
                    //Console.WriteLine("[TEST] " + parts[i]);
                    res.AddRange(ascii.GetBytes(parts[i]));
                    res.AddRange(ascii.GetBytes("\r\n"));
                }

            }
        }
        return res.ToArray();
    }

但是,我仍然收到错误消息“GZip标头中的幻数不正确。请确保传入GZip流。”

编辑(2):从here复制答案后,我成功地解压缩了身​​体。

新问题:Firefox。

error http://gyazo.com/7c40af607471fbdd3c4968af547004b6.png

我现在不确定是否需要解压缩gzip页面..

我现在哪里出错?

2 个答案:

答案 0 :(得分:2)

你说过,你使用这段代码进行gzip / deflate。但deflate与gzip不同,特别是它没有像gzip那样的魔术头。 Deflate在RFC1951中定义,RC1952中的gzip。此外,根据RFC1950,Firefox和Chrome(但不是Internet Explorer)等浏览器也接受“raw deflate”。 因此,在将解压缩应用于正文之前,必须首先根据使用压缩的“Content-Encoding”标头进行检查。

答案 1 :(得分:1)

事实证明,我甚至不需要解压缩压缩数据。

但是,根据解决方案:

我在this的帮助下分开了身体,并试图解开它。我没有意识到的是,我发送了大约500个空白字节,这产生了一个错误的请求(压缩数据中包含html),所以无论如何我都无法解压缩。