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