arrays — распаковка вектора в другой вектор с использованием миниза в Stack Overflow

Я пытаюсь сделать самую простую вещь здесь. Я хочу создать метод, который будет принимать массив байтов (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.

0

Решение

Предостережение: полностью непроверенный код.

Это должно пойти что-то вроде обмена

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;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]