【发布时间】:2012-12-02 12:39:14
【问题描述】:
就像标题中描述的那样,我想解压缩一个 HTTP-Resonse。 这是我的工作:
- 接收 http 响应
- 检查内容编码(假设它的 gzip)
- 从http-response中提取内容(此时的结果是一个包含HTTP-Message内容的字节数组)
- 尝试解压内容字节数组
最后一点不起作用。我收到此错误:“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
这就是我的猜测,我必须做些什么来解压消息:
- 提取
CHUNK1_DATA到CHUNKn_DATA(没有/cr/n和没有0,最后一个块) - 连接
CHUNK1_DATA...CHUNKn_DATA到一个byte-array - 用上面的代码解压
byte-array
非常感谢您的回答。
【问题讨论】:
标签: http gzip compression chunked-encoding