使用c ++中的miniz将矢量解压缩到另一个矢量

时间:2017-05-09 20:39:01

标签: c++ arrays vector miniz

我试图在这里做最简单的事情。我想创建一个接收字节(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。

1 个答案:

答案 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;