【问题标题】:Android NDK zlib returning Z_DATA_ERROR for valid zip infoAndroid NDK zlib 返回 Z_DATA_ERROR 以获得有效的 zip 信息
【发布时间】:2011-06-02 02:23:17
【问题描述】:

我正在执行以下操作来解压缩压缩数据块:

z_stream stream;
int err;

int nExtraChunks;
uInt destlen;

stream.next_in = (Bytef*)pSrc;
stream.avail_in = (uInt)nSrcLen;
destlen = (uInt)*pnDestLen;
stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.opaque = Z_NULL;

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

nExtraChunks = 0;
do {
    stream.next_out = pDest;
    stream.avail_out = destlen;
    err = inflate(&stream, Z_FINISH);
    if (err == Z_STREAM_END )
        break;
    if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))
    {
        err = Z_DATA_ERROR;
    }
    if (err != Z_BUF_ERROR) 
    {
        inflateEnd(&stream);
        return err;
    }
    nExtraChunks += 1;
} while (stream.avail_out == 0);

*pnDestLen = stream.total_out;

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

return nExtraChunks ? Z_BUF_ERROR : Z_OK;

其中 pSrc 和 nSrcLen、pDest 和 destLen 被赋予了内存块和它们各自的长度。 pSrc 包含有效 zip 文件的内容。

(这个例程改编自easyzlib驱动函数,但我直接使用NDK提供的zlib。)

第一次 inflate 调用为我进行的每个调用返回 -3 (Z_DATA_ERROR)。我已经通过将内存块写入磁盘、执行和“adb pull”将其下载到我的 Mac 并对其进行压缩来确认 zip 是有效的。我对 zlib 不太了解……我该怎么做才能调试它?

【问题讨论】:

    标签: android android-ndk zlib


    【解决方案1】:

    正如我所提到的,我正在使用 mac 进行开发。我正在用“zip”压缩文件,这显然是一个禁忌。尽管“解压缩”和“gunzip”都可以很好地处理文件,但这是正确的。您必须使用 gzip 来获得 Android 的 NDK 的 libz 可以处理的存档。至于“你如何调试这种东西”这个问题,我仍然没有一个好的答案,所以我坚持使用我的魔法力量,直到有更好的事情出现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多