boost :: iostreams :: zlib :: default_noheader, похоже, игнорируется - PullRequest
2 голосов
/ 14 июля 2010

У меня проблемы с получением фильтра zlib boost :: iostreams для игнорирования заголовков gzip ... Похоже, что установка default_noheader для zlib_param в значение true и последующий вызов zlib_decompressor () приводит к ошибке data_error (некорректная проверка заголовка).Это говорит мне, что zlib все еще ожидает найти заголовки.Кто-нибудь получил boost :: iostreams :: zlib для распаковки данных без заголовков?Мне нужно иметь возможность читать и распаковывать файлы / потоки, которые не имеют двухбайтового заголовка.Любая помощь будет принята с благодарностью.

Вот модифицированная версия примера программы, предоставленная документацией boost :: iostreams :: zlib:

#include <fstream>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/zlib.hpp>

int main(int argc, char** argv)
{
    using namespace std;
    using namespace boost::iostreams;

    ifstream ifs(argv[1]);
    ofstream ofs("out");
    boost::iostreams::filtering_istreambuf in;
    zlib_params p(
            zlib::default_compression,
            zlib::deflated,
            zlib::default_window_bits,
            zlib::default_mem_level,
            zlib::default_strategy,
            true
    );

    try
    {
        in.push(zlib_decompressor(p));
        in.push(ifs);
        boost::iostreams::copy(in, ofs);
        ofs.close();
        ifs.close();
    }
    catch(zlib_error& e)
    {
        cout << "zlib_error num: " << e.error() << endl;
    }
    return 0;
}

Я знаю, что мои тестовые данные неплохие;Я написал небольшую программу для вызова gzread () в тестовом файле;он успешно распакован ... поэтому я не понимаю, почему это не работает.

Заранее спасибо.

-Ice

Ответы [ 3 ]

0 голосов
/ 23 сентября 2010

Гораздо проще, попробуйте это:

FILE* fp = fopen("abc.gz", "w+");
int dupfd = dup( fileno( fp ) );
int zfp = gzdopen( dupfd, "ab" )
gzwrite( zfp, YOUR_DATA, YOUR_DATA_LEN );
gzclose( zfp );
fclose( fp );

Ссылка с zlib и включение zlib.h Вы можете использовать STDOUT вместо файла с помощью fileno (stdout)

0 голосов
/ 27 марта 2014

Просто используйте boost::iostreams::gzip_decompressor для распаковки файлов gzip.

Например:

#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/filtering_stream.hpp>

// ...

boost::iostreams::filtering_istream stream;
stream.push(boost::iostreams::gzip_decompressor());
ifstream file(filename, std::ios_base::in | std::ios_base::binary);
stream.push(file);
0 голосов
/ 08 августа 2010

Я думаю, что вы хотите сделать, это то, что описано здесь , которое предназначено для настройки параметра window bits.

* 1006 например *

zlib_params p;
p.window_bits = 16 + MAX_WBITS;

in.push(zlib_decompressor(p));
in.push(ifs);

MAX_WBITS определено в zlib.h, я думаю.

...