Boost :: IoStreams :: Zlib :: Default_noheader, кажется, игнорируется
-
15-09-2020 - |
Вопрос
У меня проблемы с усилением :: Filter Zlib Zlib IStreams, чтобы игнорировать заголовки Gzip ... кажется, что настройка Zlib_Param's default_noheader к true, а затем вызов zlib_deCompressor () дает ошибку «data_Error» (неправильная проверка заголовка).Это говорит мне, что Zlib все еще ожидает найти заголовки. Кто-нибудь получил усиление :: 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
Решение
Я думаю, что вы хотите сделать, это то, что описано здесь , который должен настроить параметр window bits
.
e.g
zlib_params p;
p.window_bits = 16 + MAX_WBITS;
in.push(zlib_decompressor(p));
in.push(ifs);
.
MAX_WBITS
определяется в zlib.h Я думаю.
Другие советы
много просто, попробуйте это:
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)
Просто используйте 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);
.