【发布时间】:2017-05-22 18:25:25
【问题描述】:
我有一个作为输入的向量(它只是一个 char 数组的包装器)。 pkzip 是使用 c# sharpZipLib 创建的。
我将数据存储到一个文件中,我通过一个已签出的十六进制编辑器 zip 模板运行该文件。输入很好,没有格式错误。除了压缩数据之外的所有内容:
50 4B 03 04 14 00 00 00 08 00 51 B2 8B 4A B3 B6
6C B0 F6 18 00 00 40 07 01 00 07 00 00 00 2D 33
31 2F 31 32 38
<compressed data (6390 bytes)>
50 4B 01 02 14 00 14 00 00 00 08 00 51 B2 8B 4A
B3 B6 6C B0 F6 18 00 00 40 07 01 00 07 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 2D 33
31 2F 31 32 38 50 4B 05 06 00 00 00 00 01 00 01
00 35 00 00 00 1B 19 00 00 00 00
我有另一个向量作为输出。膨胀的数据大约有 67-68k,所以我知道它适合缓冲区。
对于我的生活,我无法让 minizip 膨胀前者并将其存储到后者中。
这是我目前所拥有的:
#include "minizip\zlib.h"
#define ZLIB_WINAPI
std::vector<unsigned char> data;
/*...*/
std::vector<unsigned char> outBuffer(1024 * 1024);
z_stream stream;
stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.opaque = Z_NULL;
stream.data_type = Z_BINARY;
stream.avail_in = data.size();
stream.avail_out = outBuffer.size();
stream.next_in = &data[0];
stream.next_out = &outBuffer[0];
int ret = inflateInit(&stream);
ret = inflate(&stream, 1);
ret = inflateEnd(&stream);
我使用调试器单步执行该方法并监视ret。 inflate 返回值 -3 和消息 "incorrect header check"。
这是一个pkzip,它是zlib 的包装器,但minizip 应该是zlib 的包装器库,它应该支持pkzip,不是吗?
我必须如何修改它才能工作?
【问题讨论】:
-
返回
nullptr有什么意义?你不会修改data,因为它是按值传递的,所以在我看来,你的函数基本上什么都不做。 -
我正在尝试测试它,我使用 nullptr 作为持有者。在实施其余方法之前,我想通过 VS watcher 确认膨胀工作。编辑:修复它,所以它是有道理的。
-
为什么我跑题了?
-
您正在尝试创建一个 mcve,但实际上并没有费心让它工作。例如,在编辑之后,您返回一个指向已超出范围并被破坏的对象的指针。但是您说唯一重要的是当使用您未提供的数据调用第三方库函数时会发生什么。我们怎么知道输入是有效的?也许它实际上有一个糟糕的标题,就像 inflate 告诉你的那样。 (哦,第三方链接——我们不使用这些,因为当它消失时,没有人可以将这个问题作为参考。也许提供代码来压缩一些文本?)
-
我对其进行了进一步修改,以消除对数据膨胀后对数据所做的任何强调。我在这里复制了 zip 的所有数据,除了实际的压缩位。一个星期以来,我一直在为这个愚蠢的简单事情苦苦挣扎。压缩它是我在完成这项工作后必须赢得的另一场战斗。
标签: c++ compression inflate