我需要使用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!
我该如何解决这个问题?我做错了什么?
答案 0 :(得分:1)
第1452行正在寻找一个zlib标头。 zlib格式不是zip格式。您需要编写自己的zip格式解码器,然后在原始充气模式下使用miniz,该模式不会查找zlib标头,而是通过解码zip标头在您找到的位置解码原始deflate数据。
或者您可以使用libzip,它会为您完成所有这些。