2013-10-24 64 views
1

我正在嘗試使用zlib的充值來解壓我從http數據包收到的一些數據。Zlib從http數據包充值數據

分組如下:

enter image description here

包,本身說,它是用gzip編碼的,所以我覺得它應該工作。但是,當我通過膨脹函數運行數據時,我得到「無效塊類型」。爲了清楚起見,我只將數據包的突出部分傳遞給膨脹函數。我錯過了什麼?

這裏是我使用解壓縮數據的代碼:

int Decompress(const u_char* strStreamIn, int nStreamInLen, u_char* strStreamOut) 
{ 
    int ret = -1; 
    int err = -1; 

    z_stream strm = {0}; 
    strm.total_in = strm.avail_in = nStreamInLen; 
    strm.total_out = strm.avail_out = nStreamInLen * 6; 
    strm.next_in = (Bytef*) strStreamIn; 
    strm.next_out = (Bytef*) strStreamOut; 
    strm.zalloc = Z_NULL; 
    strm.zfree  = Z_NULL; 
    strm.opaque = Z_NULL; 

    err = inflateInit2(&strm, -MAX_WBITS); 
    if (err == Z_OK) { 
    err = inflate(&strm, Z_FINISH); 
    if (err == Z_STREAM_END) { 
     ret = strm.total_out; 
    } 
    else { 
     inflateEnd(&strm); 
     return err; 
    } 
    } 
    else { 
    inflateEnd(&strm); 
    return err; 
    } 
    inflateEnd(&strm); 
    return ret; 
} 
+0

根據[這篇文章](http://stackoverflow.com/questions/17872152/decompress-with-gz-functions-succeeded-but-failed-with-inflate-functions-using?rq=1)和[這個帖子](http://stackoverflow.com/questions/1838699/how-can-i-decompress-a-gzip-stream-with-zlib?lq=1),我應該使用:'inflateInit2(&strm,16 + MAX_WBITS);'但即使我這樣做,我也會得到「未知的標題標誌集」。 – Drexlin

回答

0

是的,你需要使用inflateInit2()與第二個參數爲31要求的gzip壓縮。如果你餵它1f 8b 08 00 ...,那麼你不會得到「未知的標題設置」。那絕對不是你在做什麼。

順便說一句,它沒有設置total_intotal_out你在哪裏做什麼,因爲它們被設置爲零inflateInit[2]()。將它們設置爲您在有效位置完成的值,例如在inflateInit之後,也沒有意義。

avail_out設置爲6倍的輸入大小是一種猜測,並不總是足夠的。如果這還不夠,那麼你會在Z_FINISH處得到一個錯誤。您應該使用循環根據需要多次調用inflate()來處理輸入並生成輸出。

我建議您閱讀zlib.h,然後閱讀how to use zlib

+0

馬克,感謝您確認我的代碼(大部分)是正確的,並且在採納您的建議並仔細觀察傳遞的數據後,我發現問題所在。我寫了一個函數中存在一個錯誤,它將一個緩衝區複製到另一個緩衝區。我也刪除了'total_in'和'total_out'的初始化。我將'avail_out'設置爲輸入的6倍,以使函數正常工作。我現在要解決的是更準確。感謝你的幫助! – Drexlin