ну да, так и есть, сперва идет 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());
}
}