在 c++ 中使用 miniz 将一个向量解压缩为另一个向量



我在这里尝试做最简单的事情。我想创建一个方法,该方法将接受一个字节 (char) 数组,使用 miniztinfl_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。

警告:完全未经测试的代码。

它应该像交换一样

unsigned char *outBuffer = new unsigned char[1024 * 1024];

std::vector<unsigned char> outBuffer(1024 * 1024);

获取向量。然后使用data方法调用tinfl_decompress以获取矢量的基础缓冲区。它应该看起来像

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 的容量。如果这是一个问题,则需要对std::vector::shrink_to_fit进行额外的调用。

最后

return outBuffer;

最新更新