c++ - 在 C++ 中使用 miniz 将一个 vector 解压缩为另一个 vector

标签 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),所以我无法打包它变成一个 vector 并发送它的方式。我曾希望 outBytes 能够保存输出的大小,但在解压缩后它们被设置为 1。我知道解压没有失败,因为返回的 statusTINFL_STATUS_DONE (0)

这是正确的做法吗?这是一个在我的程序中会被多次调用的方法,所以我想要尽可能快的方法。

如何从中提取 vector ?我应该使用不同的数据类型吗?数组([] 类型)?解压后的数据只会按顺序读取一次,读取完后将被丢弃。

编辑:

看来我尝试解压的文件格式不正确;它是 zip,这需要 zlib。

最佳答案

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

它应该像交换一样

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

对于

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

得到一个 vector 。然后使用 data 方法调用 tinfl_decompress 以获取 vector 的底层缓冲区。它应该看起来像

status = tinfl_decompress(&inflator, 
                          (const mz_uint8 *)&data[9], 
                          &inBytes, 
                          (mz_uint8 *)outBuffer.data(), 
                          (mz_uint8 *)outBuffer.data(), 
                          &outBytes, 
                          0);

然后调整 vector 大小为 vector 中存储的字节数,以方便以后使用。

outBuffer.resize(outBytes);

请注意 vector 不会缩小。它的容量仍为 1 MiB。如果这是一个问题,额外的 call to std::vector::shrink_to_fit is required .

最后

return outBuffer;

关于c++ - 在 C++ 中使用 miniz 将一个 vector 解压缩为另一个 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43879442/

相关文章:

c++ - vector <X*> vec 与 vector <X>* vec

c++ - 连接正向和反向 vector

c++ - 使用 boost 迭代器针对映射的每个键在值容器的每个元素上实现迭代器

c++ - 如何在 C++ 中增加 vector 中 k 个连续元素的值?

java - 使用 Arrays.sort() 和 Arrays.binarySearch() 获取存储在数组中的整数列表

c# - 排序数组,使所有正数首先出现

c++ - lambda 函数的 setter ?

c++ - 具有默认模板参数的模板成员转换运算符到与 typename 绑定(bind)的函数

javascript - 从数组中删除最后添加的值而不改变它

c++ - vector vector 的段错误