![]() |
![]() |
![]() |
#1 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
![]() |
![]()
как известно некоторые опкоды приходят не по одному, а пачками, как например SMSG_COMPRESSED_MOVES, COMPRESSED_UPDATE_OBJECT...
Где можно глянуть как распаковать такие данные ? или подкиньте кусок кода. |
![]() |
![]() |
![]() |
#2 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
![]() |
![]()
Дак тамже простейший zlib.
Или ты не про это? |
![]() |
![]() |
![]() |
#3 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
![]() |
![]()
Про то.
Просто я никогда не использовал zlib библиотеку и не знаю что там с чем едят |
![]() |
![]() |
![]() |
#4 |
Гость
Сообщений: n/a
|
![]()
пусть я буду некропостером, но блин, из-за "простейший zlib" я пол дня мозг выносил с проблемой декодирования. Хорошо потом стал проверять, отсекая первые байты.
что то вроде: 1. uint32 - размер данных после декодирования 2. 2 байта относятся к zlib , никакой полезной нагрузки не несут. 3. остальное - сжатые данные, без заголовков зы в подтверждение у TOM_RUS-а увидел распаковку ![]() |
![]() |
![]() |
#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. |
![]() |
![]() |
![]() |
#6 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
![]() ![]() ![]() ![]() ![]() ![]() |
![]()
спросил бы
![]() все правильно сделал. только inflateEnd надо еще на Z_OK проверять. |
![]() |
![]() |
![]() |
#7 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
![]() |
![]()
Я сейчас точно не помню, но судя по своему же коду вызов inflateEnd не нужен, ибо возврат из функции идет сразу после проверки (inflate(&m_zstream, Z_FINISH) == Z_STREAM_END)
насколько я помню документацию на злиб, то если вызов inflate завершился кодом Z_STREAM_END, то данные полностью распакованы. В данном случае поскольку нам известна заранее длина распакованных данных, то можно сразу выделять буфер нужной длины. Что у меня в коде и делается, так что строчку с inflateEnd надо удалить нафиг -) |
![]() |
![]() |
![]() |
#8 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
![]() ![]() ![]() ![]() ![]() ![]() |
![]()
представь, что будет, если тебе придется обрабатывать битый пакет или пакет с ошибками Lordronn
![]() проверять надо всё, включая переполнения буфера и inflateEnd. и вообще строго говоря, кто сказал что надо сразу inflate(&m_zstream, Z_FINISH) вызывать? пакеты с ачивками в волке очень большие могут быть. размер m_zstream.avail_out делать больше одной страницы - не по феншую как бэ... но можно. в спецификации там WORD был вроде (тоже не помню), но я пробовал и longword в полмега и распаковывается все за один раз без проблем в принципе. но в таких случаях могут возникать ошибки stack overflow когда прога разрастется и хрен ты их найдешь сходу ![]() Последний раз редактировалось RomanRom2; 10.05.2011 в 19:58. |
![]() |
![]() |
![]() |
#9 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
![]() |
![]()
ну в идеале конечно да
|
![]() |
![]() |
![]() |
#10 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
![]() ![]() ![]() ![]() ![]() ![]() |
![]()
а мы разве не к нему стремимся?
|
![]() |
![]() |
![]() |
#11 | |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
![]() |
![]() Цитата:
![]() Для моего случая этого было достаточно |
|
![]() |
![]() |
![]() |
#12 |
Умный
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
![]() |
![]() |
![]() |
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[13329] Quaternion [Packed] <-> [Unpacked] | Konctantin | Копаем клиент | 3 | 12.12.2010 22:58 |
Нужны данные с Кеша 3.3.2 | MaxXx2021 | Новичкам | 42 | 17.04.2010 23:14 |
Данные и Информация | MaxXx2021 | Новичкам | 8 | 24.03.2010 04:00 |
[9606] Send packed caster GUID for AFLAG_NOT_CASTER. | newsbot | CMaNGOS Commits | 0 | 19.03.2010 17:40 |