c# - 从 c# 调用 c zlib 解压缩

标签 c# c marshalling dllimport zlib

我有 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[] 数组编码为非托管指针吗? 或者可能是什么问题?我的输入数组无效吗?

最好的问候

最佳答案

经过越来越多的研究,我觉得一切都在这里, 错误一定在别处。

关于c# - 从 c# 调用 c zlib 解压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10282315/

相关文章:

c - C 中的管道 - 命令 2 中的错误

c - PIC18F87f22(C 语言)上的冲突声明和类型重新声明问题

java - 如何避免 Java RMI 的 MarshalException?

c# - 从控制台应用程序引用时,静态文件不适用于 AspNetCore Web 应用程序

C将静态数组复制到结构中

c# - .NET 的文件搜索 API

java - JAXB 编码到 XML - 模式验证失败时有没有办法处理它?

C#:指向结构体内部结构体的指针

c# - .NET 4.0 中的 IProgress<T>

c# - 如何在 C# 中获取当前产品版本?