2012-05-27 214 views
0

我已經編碼了一個應用程序,該應用程序應該解壓縮以gzip/deflate格式編碼的數據。ZLIB解壓縮

爲了做到這一點,我使用zlib庫,使用解壓縮功能。

的問題是,該功能不起作用!換句話說,數據不是未壓縮的!

我在這裏發佈的代碼:

int (*decompress)(PBYTE,PULONG,PBYTE,ULONG); 

void DecodeData(PBYTE data,ULONG dataSize){ 
    LoadLibrary("C:\\zlib1.dll"); 

    decompress=(int(*)(PBYTE,PULONG,PBYTE,ULONG))GetProcAddress(
    GetModuleHandle("zlib1.dll"),"uncompress"); 

    // Yeah I know the size is hardcoded and it's not right, but it's just a test, 
    // so nevermind 

    PBYTE decompressedData=(PBYTE)VirtualAlloc(NULL,300,MEM_COMMIT|MEM_RESERVE, 
    PAGE_EXECUTE_READWRITE); 
    ULONG maxSize=250; 

    decompress(decompressedData,&maxSize,data,dataSize); 

    MessageBox(0,(char*)decompressedData,0,MB_OK);//MessageBox shows no data, it's blank! 
} 

的指針功能被成功用GetProcAddress來獲得,問題是,函數返回NULL(甚至沒有錯誤zlib的文檔中列出)

在此先感謝=)

+4

你爲什麼使用'PAGE_EXECUTE_READWRITE'?如果您將未驗證的數據添加到其中,則永遠不應該使頁面可執行。另外爲什麼從硬編碼路徑動態加載庫?爲什麼不直接給zlib1.lib以便將動態符號表添加到可執行文件中? – datenwolf

+0

調用解壓縮後,maxSize的值是多少? – Attila

+0

@Attila:值保持不變:250,沒有變化... – Ananas

回答

-3

爲什麼在你的GetProcAddress的使用「解壓縮」,而是試圖解壓? 您獲取'uncompress'例程的地址!

+0

哦,對不起,該函數的名稱是UNCOMPRESS(如ZLIB文檔中所寫),但我已經錯誤地將它命名爲解壓縮,Anyway我將它作爲解壓縮導入,所以它是一樣的 – Ananas

+0

但仍然嘗試解壓縮,而不是解壓縮。 – Xearinox

+2

我不明白你!我調用一個名爲「解壓縮」的函數,但它的地址是通過導入「解壓縮」 - >它是相同的,我可以調用我的函數指針foo! – Ananas

5

uncompress()函數不會解壓縮gzip數據,並且根據「deflate」的含義,它可能不會解壓。

有三種可能的格式可供參考,它們是實際壓縮數據,可能帶有一些短標題和預告片,以識別流並在最後提供一些校驗數據。存在原始減壓數據,如RFC 1951所述。由RFC 1950定義了zlib包裝的deflate數據。有gzip-wrapped放氣數據,由RFC 1952定義。

uncompress()將僅解壓縮的zlib包裹DEFLATE數據。它不會解壓縮gzip-wrapped數據或原始deflate數據。

你沒有提供你想要做什麼的上下文。然而,當你說「gzip/deflate」時,我可能會猜到,你指的是HTTP內容編碼選項的名稱。在這種情況下,由於名稱的不幸選擇,「deflate」內容編碼是指zlib包裝的deflate數據,而不是原始數據。 uncompress()將解壓縮正確傳遞的HTTP泄漏內容編碼數據。

我說「正常交付」,因爲它可能不是。再次由於名稱的不幸選擇以及Microsoft程序員無法實際讀取HTTP規範,當客戶端接受deflate內容編碼時,IIS服務器將錯誤地提供原始deflate數據而不是zlib-wrapped數據。這導致客戶必須試圖解碼縮小內容編碼的兩種方式,並看看它們中的一個是否工作,或者更好的方法是首先不接受放氣編碼。如果客戶端只接受gzip內容編碼,那麼沒有問題。

您可以使用zlib的inflateInit2(),inflate()inflateEnd()函數來解碼所提及的任何格式,即gzip-wrapped,zlib-wrapped和raw。請閱讀zlib.h中的文檔以瞭解如何。

順便說一句,uncompress()函數返回一個整數,而不是指針。所以當你說函數返回NULL而不是它應該的時候,我只能假定那個函數的接口沒有被正確定義。