Декомпрессия ZLib в переполнении стека

Я пытаюсь заставить функцию разархивировать один текстовый файл, сжатый с помощью .gz. Он должен распаковать файл .gz по указанному пути и записать несжатый текстовый файл по назначению. Я использую C ++, и я видел, что ZLIB делает именно то, что мне нужно, за исключением того, что я не могу найти ни одного примера в сети, который показывает, что он делает это. Может кто-нибудь показать мне пример или, по крайней мере, направить меня в правильном направлении?

0

Решение

Если вы просто хотите накачать файл необработанными дефлированными данными (т.е. без архива), вы можете использовать что-то вроде этого:

gzFile inFileZ = gzopen(fileName, "rb");
if (inFileZ == NULL) {
printf("Error: Failed to gzopen %s\n", filename);
exit(0);
}
unsigned char unzipBuffer[8192];
unsigned int unzippedBytes;
std::vector<unsigned char> unzippedData;
while (true) {
unzippedBytes = gzread(inFileZ, unzipBuffer, 8192);
if (unzippedBytes > 0) {
unzippedData.insert(unzippedData.end(), unzipBuffer, unzipBuffer + unzippedBytes);
} else {
break;
}
}
gzclose(inFileZ);

unzippedData вектор теперь содержит ваши завышенные данные. Возможно, есть более эффективные способы хранения завышенных данных, особенно если вы заранее знаете размер несжатого файла, но этот подход мне подходит.
Если вы хотите сохранить раздутые данные в файл без дальнейшей обработки, вы можете пропустить вектор и просто написать unzipBuffer содержимое в другой файл.

3

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

Вы можете использовать gzopen(), gzread(), а также gzclose() функции zlib, так же, как вы бы соответствующие функции STDIO fopen()и т.д. Это прочитает файл gzip и распакует его. Вы можете использовать fopen(), fwrite()и т.д., чтобы записать несжатые данные обратно.

1

Ах, я приду http://zlib.net/zlib_how.html делает что хочешь?

0

Вы можете использовать ZLibComplete, чтобы сделать это. Полный пример в C ++ на первой странице декомпрессии GZip.

http://rudi-cilibrasi.github.io/zlibcomplete/

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector