【发布时间】:2023-10-13 21:20:01
【问题描述】:
我需要使用 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))))) 评估为假;但是由于 counter 设置为 1,因此 counter 保持等于 1。
第 1454 行:
if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); }
因为计数器值为 1,所以调用宏 TINFL_CR_RETURN_FOREVER。这样的宏跳转到标签common_exit。
除了在我的项目内部,我还使用库中提供的示例测试了 miniz 库。具体来说,我尝试解压缩我自己的个人 zip 压缩包以及由包含在带有 example5 的 miniz 库中的 example2 生成的压缩包。
在命令提示符下发出以下命令
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!
我该如何解决这个问题?我做错了什么?
【问题讨论】:
-
@JoachimPileborg 但是miniz附带的大多数示例都显示了如何解压缩文件名作为参数传递的zip文件。
标签: c zip unzip zipfile inflate