2

タイトルに記載されているように、HTTP-Resonseを解凍したいと思います。これが私がすることです:

  1. http-responseを受信します
  2. コンテンツエンコーディングを確認します(gzipを想定します)
  3. http-responseからコンテンツを抽出します(このポイントの結果は、HTTP-Messageのコンテンツを含むバイト配列です)
  4. content-byte-arrayを解凍してみてください

ラストポイントが機能していません。「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_DATAしますCHUNKn_DATA(最後のチャンク/cr/nなしおよびなし)0
  2. Concat CHUNK1_DATA... CHUNKn_DATAto onebyte-array
  3. byte-array上記のコードで解凍します

答えていただければ幸いです。

4

1 に答える 1

0

さて、私は自分で試してみましたが、質問で説明したとおりに機能しました。私のコードに興味があれば、私にメッセージを送ってください。

于 2012-12-18T14:00:03.777 に答える