2017-05-23 49 views
0
byte[] httpDecompress(HttpDatagram http) 
    { 
     int magicnum = 0x1f8b; 
     Stream str= http.Body.ToMemoryStream(); 
     using (var zipStream = new GZipStream(str, CompressionMode.Decompress)) 
     using (var resultStream = new MemoryStream()) 
     { 
      zipStream.CopyTo(resultStream); 
      return resultStream.ToArray(); 
     } 
    } 

有代碼,但它給出了一個幻數錯誤。我如何找到GZip字符串的開頭,我認爲問題的根源在那裏。誰能幫忙?我如何在MemoryStream中找到Gzip字符串的開頭?

+0

什麼是「gzip字符串」? –

+0

錯誤_「GZip標題中的幻數不正確」_表示您正在處理非Zip文件,或該文件已損壞。 – CodeCaster

+0

我想從TCP數據包中獲取HTTP正文數據。它的傳輸編碼類型是Gzip。我將它轉換爲內存流並試圖解壓縮它。給我一個錯誤的幻數錯誤,我認爲,因爲它沒有得到正確的開始點。 –

回答

0

不知道gzip流開始的位置可能是也可能不是你的問題。 (實際上,可能不是)。無論如何,您都可以搜索三字節序列1f 8b 08來識別候選gzip流。從1f開始解壓,看它是否真的是一個gzip流。

+0

好的謝謝。使用哪種方法可以幫助我搜索整個1460字節的數據? –

+0

@GökberkAçıkgöz你有什麼(充其量)是不完整的數據。 1460很可能是一個數據包的大小(這是一個非常常見的數據包大小,而HttpDatagram這個詞在這裏是一個很大的贈品......)。您需要離開檢查數據包並獲取/組裝整個HTTP響應,超出了表示報頭結尾的雙回車符。你不能只從GZipped響應中挑出1460(或更少)字節,並將它扔到解碼器。它不這樣工作。你需要***整個***反應機構。 – spender

+0

哦,謝謝,你能幫我組裝整個身體嗎? –

相關問題