Я пытаюсь сделать самую простую вещь здесь. Я хочу создать метод, который будет принимать массив байтов (char), раздувать его с помощью мини tinfl_decompress
метод, а затем вернуть байтовый массив, содержащий завышенные данные.
Обо всем по порядку. Приведенные массивы никогда не будут больше 100 кБ, подавляющее большинство будет меньше 50 кБ. Следовательно, я не думаю, что мне нужно использовать какой-либо буфер для этого. Во всяком случае, это то, что у меня есть:
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
, но я не знаю, как долго это (я знаю, что это будет меньше 1 МБ), поэтому я не могу упаковать его в вектор и отправить его в путь. Я надеялся, что outBytes
будет содержать размер вывода, но они будут установлены в 1 после распаковки. Я знаю, что декомпрессия не провалилась, так как status
вернулся TINFL_STATUS_DONE (0)
,
Это даже правильный способ сделать это? Это метод, который будет часто вызываться в моей программе, поэтому я хочу, чтобы что-то было как можно быстрее.
Как мне получить вектор из этого? Должен ли я использовать другой тип данных? Массив (тип [])? Распакованные данные будут считаны последовательно только один раз, после чего они будут отброшены.
РЕДАКТИРОВАТЬ:
Похоже, что файл, который я пытался распаковать, был неправильного формата; это был почтовый индекс, это берет zlib.
Предостережение: полностью непроверенный код.
Это должно пойти что-то вроде обмена
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 МБ. Если это проблема, дополнительный позвонить std::vector::shrink_to_fit
необходимо.
в заключение
return outBuffer;
Других решений пока нет …