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如果輸入數據已損壞。
我是否需要將字節[]數組編組爲非託管指針? 或者有什麼問題?我的輸入數組無效嗎?
問候
爲什麼不直接使用['zlib.net'](http://www.componentace.com/zlib_.NET.htm)而不是在非託管庫上編寫託管包裝? – 2012-04-23 14:36:01
嗨,壓縮和解壓縮函數從原始的zlib函數被修改,所以我必須構建dll並使用它 – Gobliins 2012-04-23 14:38:59
看起來一見鍾情。如果你有DLL的源代碼在調試中編譯它,並啓動一個調試「混合模式」會話,以找出發生了什麼問題。 – Drake 2012-04-24 09:54:57