我试图在这里做最简单的事情。我想创建一个接收字节(char)数组的方法,使用miniz tinfl_decompress
方法对其进行膨胀,然后返回包含膨胀数据的字节数组。
首先要做的事情。给出的数组永远不会超过100kB,绝大多数将小于50k。因此,我认为我不需要使用任何缓冲区。无论如何,这就是我所拥有的:
std::vector<unsigned char> unzip(std::vector<unsigned char> data)
{
unsigned char *outBuffer = new unsigned char[1024 * 1024];
tinfl_decompressor inflator;
tinfl_status status;
tinfl_init(&inflator);
size_t inBytes = data.size() - 9;
size_t outBytes = 1024 * 1024;
status = tinfl_decompress(&inflator, (const mz_uint8 *)&data[9], &inBytes, outBuffer, (mz_uint8 *)outBuffer, &outBytes, 0);
return ???
}
我知道我想要的输出是从内存位置&outBuffer
开始的,但我不知道它有多长(我碰巧知道它会少于1MB),所以我无法打包它进入矢量并按照它的方式发送它。我原本希望outBytes
保持输出的大小,但是在解压缩后它们被设置为1。我知道解压缩并没有失败,因为status
返回的是TINFL_STATUS_DONE (0)
。
这甚至是正确的做法吗?这是一个在我的程序中会被调用的方法,所以我想要尽可能快的东西。
如何从中获取矢量?我应该使用不同的数据类型吗?数组([]类型)?解压缩后的数据只会在被丢弃之后按顺序读取一次。
修改
似乎我尝试解压缩的文件格式不正确;它是zip,这需要zlib。
答案 0 :(得分:2)
警告:完全未经测试的代码。
它应该像交换
unsigned char *outBuffer = new unsigned char[1024 * 1024];
的
std::vector<unsigned char> outBuffer(1024 * 1024);
获取矢量。然后使用tinfl_decompress
方法调用data
以获取向量的底层缓冲区。它应该看起来像
status = tinfl_decompress(&inflator,
(const mz_uint8 *)&data[9],
&inBytes,
(mz_uint8 *)outBuffer.data(),
(mz_uint8 *)outBuffer.data(),
&outBytes,
0);
然后resize
向量到存储在向量中的字节数以方便以后。
outBuffer.resize(outBytes);
请注意,矢量不会调整大小。它仍然具有1 MiB的容量。如果这是一个问题,请额外call to std::vector::shrink_to_fit
is required。
最后
return outBuffer;