1

私はdllimportを持っています

[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#側でnullを受け取ることになります。
編集:エラーはz_data_errorです。
edit2:入力データが破損している場合はZ_DATA_ERROR。

byte []配列をアンマネージポインターにマーシャリングする必要がありますか?または、何が問題になる可能性がありますか?入力配列が無効ですか?

よろしくお願いします

4

1 に答える 1

0

ますます研究を重ねた結果、すべてがここにあり、エラーは他の場所にあるに違いないと感じました。

于 2012-04-24T09:47:33.723 に答える