Показать сообщение отдельно
Старый 10.05.2011, 19:10   #5
Йоха
Умный
 
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
Йоха Скоро придёт к известности
По умолчанию

ну да, так и есть, сперва идет DWORD - размер данных после распаковки, а потом кусок данных который нужно отдать для обработки функции inflate
Я тогда сразу написал класс для распаковки:
Код:
bool CZlib::decompress(BYTE* in_buffer, int in_size, int out_size)
{
	m_out_buffer = new BYTE[out_size];
	if (!m_out_buffer)
	{
		return false;
	}
	m_zstream.next_in = in_buffer;
	m_zstream.avail_in = in_size;
	m_zstream.next_out = m_out_buffer;
	m_zstream.avail_out = out_size;
	if (inflateInit(&m_zstream) == Z_OK)
	{
		if (inflate(&m_zstream, Z_FINISH) == Z_STREAM_END)
		{
			return true;
		}
		inflateEnd(&m_zstream);
	}
	return false;
}
И использовался он так:
Код:
void CDataHandler::on_SMSG_COMPRESSED_UPDATE_OBJECT(BYTE* _packet, DWORD _len)
{
	int unpacked_len = 0;
	memcpy(&unpacked_len, _packet, 4);
	CZlib zlib;
	if (zlib.decompress(_packet + 4, _len - 4, unpacked_len))
	{
		parse_update(zlib.get_data());
	}
}

Последний раз редактировалось Йоха; 10.05.2011 в 19:14.
Йоха вне форума   Ответить с цитированием