使用状态为-1的迷你符出口解压缩zip文件(TINFL_STATUS_FAILED)

时间:2015-08-18 16:21:53

标签: c zip unzip zipfile inflate

我需要使用miniz库来解压缩项目中的一些zip文件。问题是功能

tinfl_decompress

始终以状态TINFL_STATUS_FAILED退出。

我做了一些调试,发现了miniz.c中的有问题的代码行:

第1452行:

counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8));

计数器设置为1;

第1453行:

if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4)))));

(((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4)))))评估为false;但是,由于计数器设置为1,计数器保持等于1。

第1454行:

if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); }

由于计数器值为1,因此调用宏TINFL_CR_RETURN_FOREVER。这样的宏跳转到标签common_exit

除了我的项目内部,我已经使用libary提供的示例测试了miniz库。具体来说,我试图解压缩我自己的个人zip存档以及miniz库中包含的example2生成的zip存档和example5。

在命令提示符下发出folling命令

example5.exe d __mz_example2_test__.zip __mz_example2_test__.decompress

生成以下输出:

miniz.c example5 (demonstrates tinfl/tdefl)
Mode: d, Level: 9
Input File: "__mz_example2_test__.zip"
Output File: "__mz_example2_test__.decompress"
Input file size: 33768
tinfl_decompress() failed with status -1!

我该如何解决这个问题?我做错了什么?

1 个答案:

答案 0 :(得分:1)

第1452行正在寻找一个zlib标头。 zlib格式不是zip格式。您需要编写自己的zip格式解码器,然后在原始充气模式下使用miniz,该模式不会查找zlib标头,而是通过解码zip标头在您找到的位置解码原始deflate数据。

或者您可以使用libzip,它会为您完成所有这些。