![](/img/trans.png)
[英]Sorting a vector using another vector in C++ without lambda function
[英]Decompressing a vector into another vector using miniz in c++
我正在尝试在这里做最简单的事情。 我想创建一个将接收字节(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。
警告:完全未经测试的代码。
它应该像交换一样
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.