Кто пользовался zlib`ом - подскажите как правильно пользоваться функцией uncompress. Вот я качаю данные с веба, как узнать их реальный размер? Чтобы выделить память под распаковку? Вот цитата из русского мана
я для своих нужд переписал zlib на асм так, что принимаются только два параметра - входной и выходной буферы, на сях проблематично будет убрать размеры (хотя они при распаковке нафиг не нужны) т.к. завязано много на них, хотя и можно, если убить часа 3-4. А так обычно сжатый и несжатый размеры хранятся, для тех хе архивов
ну вот так - не нужны, для злиб размер распаковываемых данных не важен, когда остановиться и так будет видно, а размер выходного буфера нужен только для проверки выхода за границу доступной области, вот и все
Видимо я чегото не догоняю, объясни плиз, вот код, на котором я тестирую функцию uncompress Код (Text): FILE *f; if(f = fopen("D:\\tmp96.tmp","rb")) // D:\\tmp96.tmp - запакованный файл, (я сохраняю то что мне присылает сайт) { LPSTR lpMem; DWORD dwSize = _filelength(f->_file); char buffer[MAX_PATH]; if(lpMem = (LPSTR) malloc(dwSize)) { fread(lpMem,dwSize,1,f); DWORD i=0; int t = uncompress((unsigned char *) &buffer,&i,(unsigned char *) lpMem,dwSize); if(t == Z_OK) { MessageBox(0,"Z_OK",0,0); } else if(t == Z_MEM_ERROR) { MessageBox(0,"Z_MEM_ERROR",0,0); } else if(t == Z_BUF_ERROR) { MessageBox(0,"Z_BUF_ERROR",0,0); } else if(t == Z_DATA_ERROR) { MessageBox(0,"Z_DATA_ERROR",0,0); } free(lpMem); } fclose(f); } Вот почему постоянно выдается Z_DATA_ERROR, что я не так делаю?
а что, сайты сразу же чистый поток выдают? там gzip - заголовок какой-то ведь есть, а поток уже после него идет
uncompress - уже с потоком работает? как добратся до потока минуя заголовки? можешь подкинуть примерчик?
гугли формат гзип, но заголовок там кажется фиксированный и равен 8 байт - пропускаешь их и идет поток, в первых 8ми байтах - распакованный размер. Но это по памяти, могу ошибиться
gazlan Пример твой смотрел, вопрос по структуре ZIP_LOCAL_FILE_HEADER, судя по твоему коду ZipStream.avail_in = pLFHeader->_dwPackSize; в структуре ZIP_LOCAL_FILE_HEADER _dwPackSize - это размер незапакованного файла, я же нашел только такую структуру и поля тут нет такого Код (Text): #pragma pack(push, 1) struct zip_local_file_header { DWORD header_sig;// 4bytes (0x04034b50) WORD version;// needed to extract 2 bytes WORD general_flags;// purpose bit flag 2 bytes WORD compression_method;// 2 bytes WORD last_mod_file_time;// 2 bytes WORD last_mod_file_date;// 2 bytes DWORD crc32;//-32 4 bytes DWORD compressed_size; // 4 bytes DWORD uncompressed_size; // 4 bytes WORD file_name_length; // 2 bytes WORD extra_field_length; // 2 bytes //char *file_name; // (variable size) //char *extra_field; // (variable size) }; #pragma pack(pop) masquer Все что мне удалось найти по gzip Код (Text): typedef struct gz_header_s { int text; /* true if compressed data believed to be text */ uLong time; /* modification time */ int xflags; /* extra flags (not used when writing a gzip file) */ int os; /* operating system */ Bytef *extra; /* pointer to extra field or Z_NULL if none */ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ uInt extra_max; /* space at extra (only when reading header) */ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ uInt name_max; /* space at name (only when reading header) */ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ uInt comm_max; /* space at comment (only when reading header) */ int hcrc; /* true if there was or will be a header crc */ int done; /* true when done reading gzip header (not used when writing a gzip file) */ } gz_header; но чтото не похоже чтоб в нем хранился реальный размер файла В аттаче запакованный файл gzip`ом если кто может помочь приведите рабочий пример как его распаковать ч-з uncompress или inflate, распаковка ч-з gzopen и т.д. проходит нормально, но не хочется связыватся с файлами, я хочу работать только с памятью.
да, тут я был неправ (про хранение в начале). Короче, чтоб распаковать, компилируй злиб с GUNZIP и можешь ему сам файл подсовывать (реальный размер на тех хтмл, которые в гзипе отдаются пишется в самый последний дворд)
Как и следует из названия, это размер _упакованного_ блока. Unpacked size при распаковке, вообще говоря, неважен - лишь бы хватило буфера, чтобы не гонять в цикле.
10_Brasil В аттаче запакованный файл gzip`ом если кто может помочь приведите рабочий пример как его распаковать В аттаче пример на Си. zlib1.dll и zlib1.lib получены из zlib122.
q_q Спасибо за пример, только я писал выше что с gzopen, gzread и т.д. я работать сразу научился (опыт php помог), т.е. проблем с этим конкретно нет, другое дело, что я пишу программу, которая периодически скачивает страницу с сайта (он собственно кодирует страницу в gzip), и мне важно распаковывать данные налету, а не сохранять на диск а затем считывать...
10_Brasil См. аттач. Функция ungz (аналог zlib.uncompress) с проверкой наличия заголовка (этим zlib.uncompress отличается от zlib.gzopen). Правда проверить все поля заголовка не удалось, мой gzip умет (или у меня хватает ума его заставить) добавить в заголовок только FLG.FNAME.
Еще ковыряя всю эту тему наткнулся на библиотеки wwwlib и libcurl, что касается второй то то можно смело сказать что это лучший выбор для лентяев, все делает за меня, учитывая что довелось поработать и wininet, winhttp, и просто с сокетами - libcurl пока лучшее что я видел (если скомпилировать с zlib`ом то автоматом распаковывает данные, естественно если указать curl_easy_setopt(curl_handle, CURLOPT_ENCODING, "gzip,deflate").