【问题标题】:Decompress a gzip-compressed HTTP-Response (chunked encoding)解压缩 gzip 压缩的 HTTP 响应(分块编码)
【发布时间】:2012-12-02 12:39:14
【问题描述】:

就像标题中描述的那样,我想解压缩一个 HTTP-Resonse。 这是我的工作:

  1. 接收 http 响应
  2. 检查内容编码(假设它的 gzip)
  3. 从http-response中提取内容(此时的结果是一个包含HTTP-Message内容的字节数组)
  4. 尝试解压内容字节数组

最后一点不起作用。我收到此错误:“GZip 标头中的幻数不正确。请确保您传递的是 GZip 流。”

你能告诉我我做错了什么吗?

编辑:由于还没有答案,我在这里发布我的解压缩代码:

    public static byte[] Decompress_GZip(byte[] gzip)
    {
        using (GZipStream stream = new GZipStream(new MemoryStream(gzip),
                                   CompressionMode.Decompress))
        {
            byte[] buffer = new byte[size];
            using (MemoryStream memory = new MemoryStream())
            {
                int count = 0;
                do
                {
                    count = stream.Read(buffer, 0, size);
                    if(count>0)
                    {
                        memory.Write(buffer, 0, count);
                    }
                }
                while (count > 0);
                return memory.ToArray();
            }
        }
    }

我还没有想到:字节序可能有什么问题吗?可能 GZip 流无法处理网络字节序。

编辑: 至少我注意到,这个错误只发生在接收分块消息时。让我们假设一个分块消息如下所示:

STATUS-LINE
HEADER_1 /cr/n
...
HEADER_n /cr/n
/cr/n
CHUNK1_SIZE /cr/n
CHUNK1_DATA /cr/n
...
CHUNKn_SIZE /cr/n
CHUNKn_DATA /cr/n
0 /cr/n

这就是我的猜测,我必须做些什么来解压消息:

  1. 提取CHUNK1_DATACHUNKn_DATA(没有/cr/n 和没有0,最后一个块)
  2. 连接CHUNK1_DATA ... CHUNKn_DATA 到一个byte-array
  3. 用上面的代码解压byte-array

非常感谢您的回答。

【问题讨论】:

    标签: http gzip compression chunked-encoding


    【解决方案1】:

    嗯,我自己试了一下,效果和我在问题中描述的一样。如果您对我的代码感兴趣,请推荐或给我留言。

    【讨论】:

    • 我无法从服务器端正确地以块的形式发送数据。对必须传输的块的大小是否有任何限制,即每个数据包的某个最小大小
    • 与“每个数据包的最小大小”你在谈论最小块大小?我从来没有读过任何关于最小块大小的东西。由于最后一个块的大小为 0,我想没有最小块大小。你使用任何块头吗?您是否在 chunksize 中声明了正确的长度?你使用正确的标题字段吗? (w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11)
    • 这就是分块消息的外观:w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.6.1
    猜你喜欢
    • 2012-02-12
    • 2011-07-13
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2021-11-30
    • 2012-08-22
    • 2016-12-26
    • 1970-01-01
    相关资源
    最近更新 更多