Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2010, 23:03   #1
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию zlib->inflate как правильно использовать?

в общем пишу свою библиотеку классов, сжатие данных написал, а вот расжатие не получается, ничего не пишет в выходной буфер...
как правильно то?(библиотека скомпилирована как статическая либка с флагом NO_GZIP)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.01.2011, 20:09   #2
oleg.v
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 80
По умолчанию

посмотрите пример http://www.zlib.net/zpipe.c может там найдёте ответ. Я этим примером паковал и распаковывал нормально.
oleg.v вне форума Ответить с цитированием
Старый 07.01.2011, 22:12   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

столкнулся с проблемой того что после сжатия не могу расжать обратно полностью...
Код:
	class ZLibDecompressStream:public Stream
	{
	public:
		z_stream z;
		Stream* d;
		char b[1024];
		ZLibDecompressStream(Stream* _s):Stream()
		{
			if(!_s)throw L"Empty source stream pointer, creation impossible!";
			d=_s;
			ZeroMemory(&z,sizeof(z));
			if(inflateInit(&z))throw L"inflateInit call failed, creation impossible!";
		}
		virtual ~ZLibDecompressStream()
		{
			inflateEnd(&z);
			d->ReleaseRef();
		}
		virtual unsigned int Read(void* data,unsigned int size)
		{
			z.avail_out=size;
			z.next_out=(Bytef*)data;
			while(z.avail_out!=0)
			{
				unsigned int rr;
				if(z.avail_in==0)
				{
					rr=d->Read(b,1024);
					z.avail_in=rr;
					z.next_in=(Bytef*)b;
				}
				inflate(&z,0);
				if(rr==0)break;
			}
			return size-z.avail_out;
		}
Код:
signed long long __stdcall phLibrary_Stream_CopyFrom(Stream* t,Stream* from,signed long long count)
{
	char buff[1024];
	signed long long  r=0;
	unsigned int br=1024,l=0;
	while(count>0)
	{
		if(br>count)br=(unsigned int)count;
		l=from->Read(buff,br);
		r+=t->Write(buff,l);
		if(l!=br)break;
		br=1024;
	}
	return r;
}
открывается файл(поток S), потом создается ZLibDecompressStream(поток Z), далее открывается файл в который пишем(поток D)
потом phLibrary_Stream_CopyFrom(D,Z,0xFFF FFFFF)
и в итоге расжимается где то 90-95% исходных данных...
что не так?(или надо показать как я сжимаю?)

на этот раз библиотека скомпилирована без флага NO_GZIP.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 08.01.2011 в 00:58.
Пепел Феникса вне форума Ответить с цитированием
Старый 08.01.2011, 01:05   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

расжился исходниками ZlibEx.pas(там есть нечно подобное что мне надо)
буду пытатся по ним разобратся)
(еще б найти исходники Zlib.pas(те в котором есть TCompressionStream/TDecompressionStream, ибо тоже потоки))
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 08.01.2011 в 01:38.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.01.2011, 01:06   #5
oleg.v
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 80
По умолчанию

Могу скромно предположить, что не до разжатие следствие раннего выхода из цикла. Попробуйте в отладчике посмотреть все ли данные проходят до inflate(&z,0); Моё имхо.
oleg.v вне форума Ответить с цитированием
Старый 09.01.2011, 01:13   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
исходники Zlib.pas
http://paste.dprogramming.com/dpasnl54
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 09.01.2011, 02:11   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
	class ZLibCompressStream:public Stream
	{
	public:
		z_stream z;
		char b[Zlib_Buf_Size];
		Stream* d;
		signed long long sp;
		ZLibCompressStream(Stream* _d,int level):Stream()
		{
			if(!_d)throw L"Empty destination stream pointer, creation impossible!";
			d=_d;
			sp=_d->Seek(smFromCurrent,0);
			ZeroMemory(&z,sizeof(z));
			z.avail_out=Zlib_Buf_Size;
			z.next_out=(Bytef*)b;
			if(level<0)level=0;
			if(level>9)level=9;
			if(deflateInit(&z,level))throw L"deflateInit call failed, creation impossible!";
		}
		virtual ~ZLibCompressStream()
		{
			z.next_in=0;
			z.avail_in=0;
			if(sp!=d->Seek(smFromCurrent,0))d->Seek(smFromBegin,sp);
			while((deflate(&z,Z_FINISH)!=Z_STREAM_END)&&(z.avail_out=0))
			{
				d->Write(b,Zlib_Buf_Size);
				z.avail_out=Zlib_Buf_Size;
				z.next_out=(Bytef*)b;
			}
			if(z.avail_out<Zlib_Buf_Size)d->Write(b,Zlib_Buf_Size-z.avail_out);
			deflateEnd(&z);
			d->ReleaseRef();
		}
		virtual unsigned int Write(void* data,unsigned int size)
		{
			z.next_in=(Bytef*)data;
			z.avail_in=size;
			if(sp!=d->Seek(smFromCurrent,0))d->Seek(smFromBegin,sp);
			while(z.avail_in>0)
			{
				deflate(&z,0);
				if(z.avail_out==0)
				{
					d->Write(b,Zlib_Buf_Size);
					z.next_out=(Bytef*)b;
					z.avail_out=Zlib_Buf_Size;
					sp=d->Seek(smFromCurrent,0);
				}
			}
			return size;
		}
		virtual unsigned int Read(void* data,unsigned int size)
		{
			return 0;
		}
		virtual void SetSize(signed long long newsize)
		{
			return;
		}
		virtual signed long long Seek(SeekMethod s,signed long long o)
		{
			if(s==smFromCurrent&&o==0)return z.total_in;
			return 0;
		}
	};
вроде б все верно, но похоже что деструктор не скидывает данные(сжимал маленький файл и заметил что только Write скинула данные).
(на Делфи оригинал есть по ссылке выше)
никто не знает в чем беда?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 09.01.2011 в 14:17.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.01.2011, 19:34   #8
oleg.v
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 80
По умолчанию

Может поможет http://kapo-cpp.blogspot.com/2008/07...with-zlib.html
oleg.v вне форума Ответить с цитированием
Старый 18.01.2011, 20:26   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

специально же просил проверить
я вместо сравнения в деструкторе поставил присваивание, там и вылет за цикл, а там и не сохраняет все что надо.

спасибо, тема закрыта.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использовать Zlib для архивов apromix Помощь студентам 2 14.09.2010 12:24
Как правильно использовать функцию ExtFloodFill. SkAndrew Общие вопросы Delphi 0 14.04.2010 14:05
Как правильно использовать MonthCalendar Shanuzina Компоненты Delphi 1 04.03.2010 11:58
как правильно использовать OR AND mpdasa Общие вопросы Delphi 2 19.01.2010 17:30
Как правильно использовать ComboBox Pirotexnik Общие вопросы Delphi 6 26.03.2009 23:30