C#-gzip流幻数不正确?

C#-gzip流幻数不正确?,c#,sockets,gzipstream,deflatestream,C#,Sockets,Gzipstream,Deflatestream,所以,我想做一个程序,把电脑变成代理。除了gzip/deflate页面之外,所有这些都运行良好 每当我尝试解压时,我都会收到一个InvalidDataException,说明GzipHeader中的幻数不正确 我使用此功能: private byte[] GZipUncompress(byte[] data) { using (var input = new MemoryStream(data)) { input.Seek(0, SeekOrigin.Begin)

所以,我想做一个程序,把电脑变成代理。除了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();
        }
    }
}
解压缩数据。错误:


(来源:)

任何帮助都将不胜感激

编辑:我好像到了什么地方

正如usr所建议的,我应该编写一个HTTP解析器来获取主体并对其进行解压缩

解析之前:

解析后:

这是我到达尸体的方法:

    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();
    }
专用字节[]httpasse(字节[]数据)
{
字符串http=ascii.GetString(数据);
char[]lineBreak=crlf.ToCharArray();
string[]parts=http.Split(lineBreak);
List res=新列表();
对于(int i=1;i
但是,我仍然收到一个错误,它说“GZip头中的幻数不正确。请确保您正在传递GZip流。”

编辑(2):从复制答案后,我成功地解压缩了正文

新问题:Firefox


(来源:)

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


我现在哪里出错了?

您说过,您将此代码用于gzip/deflate。但是deflate和gzip不一样,尤其是它没有像gzip那样的魔法头。RFC1951中定义了放气,RC1952中定义了gzip。此外,根据RFC1950,Firefox和Chrome等浏览器(但不是Internet Explorer)也接受“原始deflate”。
因此,在对正文应用解压缩之前,必须首先根据使用压缩的“Content Encoding”标题进行检查。

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

但是,根据解决方案:


我在的帮助下分离了尸体,并试图将其解压。我没有意识到的是,我发送了大约500个空白字节,这产生了一个错误的请求(在压缩数据中包含html),因此我无法解压。

可能数据没有被压缩。看看字节。它们是什么样子的。作为旁注:你不需要“倒带”一个新的
内存流
Seek(0,SeekOrigin.Begin)
是redundant@usr:这是whatismyip.org的请求,看起来我需要将响应与标题分开。有什么办法吗?使用标准HTTP库下载响应。使用AutomaticDecompression。@usr:我希望保持这种方式,因为这样可以更容易地实现SOCKS。