2012-04-23 123 views
1

我有dllimport的調用C zlib的解壓縮從C#

[DllImport("../../zlib-1.2.5/zlib1.dll", CallingConvention = CallingConvention.Cdecl)] 
static extern int uncompress(byte[] destBuffer, ref uint destLen, byte[] sourceBuffer, uint sourceLen); 

,並調用它像

uint _dLen = (uint) 8192; 
byte[] data = compressed_data; 
byte[] _d = new byte[_dLen]; 

if (uncompress(_d, ref _dLen, data, (uint)data.Length) != 0) 
    return null; 

中的zlib的解壓縮功能看起來像

unsigned int ZEXPORT uncompress (dest, destLen, source, sourceLen) 
unsigned char *dest; 
Uint32 destLen; 
unsigned char *source; 
Uint32 sourceLen; 
{ 
z_stream stream; 
int err; 

stream.next_in = source; 
stream.avail_in = sourceLen; 
/* Check for source > 64K on 16-bit machine: */ 
if ((Uint32)stream.avail_in != sourceLen) return Z_BUF_ERROR; 

stream.next_out = dest; 
stream.avail_out = destLen; 
if ((Uint32)stream.avail_out != destLen) return Z_BUF_ERROR; 

stream.zalloc = (alloc_func)0; 
stream.zfree = (free_func)0; 

err = inflateInit(&stream); 
if (err != Z_OK) return err; 


err = inflate(&stream, Z_FINISH); 

if (err != Z_STREAM_END) { 
    inflateEnd(&stream); 
    if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) 
     return Z_DATA_ERROR; 
    return err; 
} 

err = inflateEnd(&stream); 
return stream.total_out; 
} 

但我總是落得在c#端接收空值。
編輯:錯誤是z_data_error。
edit2:Z_DATA_ERROR如果輸入數據已損壞。

我是否需要將字節[]數組編組爲非託管指針? 或者有什麼問題?我的輸入數組無效嗎?

問候

+1

爲什麼不直接使用['zlib.net'](http://www.componentace.com/zlib_.NET.htm)而不是在非託管庫上編寫託管包裝? – 2012-04-23 14:36:01

+0

嗨,壓縮和解壓縮函數從原始的zlib函數被修改,所以我必須構建dll並使用它 – Gobliins 2012-04-23 14:38:59

+1

看起來一見鍾情。如果你有DLL的源代碼在調試中編譯它,並啓動一個調試「混合模式」會話,以找出發生了什麼問題。 – Drake 2012-04-24 09:54:57

回答

0

越來越多的研究後,我得到的感覺,一切都在這裏, 和誤差必須在其他地方。