|
Регистрация | Файлы | Правила | Альбомы | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
Опкоды Опкоды |
|
Опции темы | Поиск в этой теме | Опции просмотра |
18.07.2010, 14:20 | #1 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
PACKED данные
как известно некоторые опкоды приходят не по одному, а пачками, как например SMSG_COMPRESSED_MOVES, COMPRESSED_UPDATE_OBJECT...
Где можно глянуть как распаковать такие данные ? или подкиньте кусок кода. |
18.07.2010, 14:52 | #2 |
Ученый
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
|
Дак тамже простейший zlib.
Или ты не про это? |
18.07.2010, 15:11 | #3 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Про то.
Просто я никогда не использовал zlib библиотеку и не знаю что там с чем едят |
10.05.2011, 19:02 | #4 |
Гость
Сообщений: n/a
|
пусть я буду некропостером, но блин, из-за "простейший zlib" я пол дня мозг выносил с проблемой декодирования. Хорошо потом стал проверять, отсекая первые байты.
что то вроде: 1. uint32 - размер данных после декодирования 2. 2 байта относятся к zlib , никакой полезной нагрузки не несут. 3. остальное - сжатые данные, без заголовков зы в подтверждение у TOM_RUS-а увидел распаковку |
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. |
10.05.2011, 19:24 | #6 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
спросил бы
все правильно сделал. только inflateEnd надо еще на Z_OK проверять. |
10.05.2011, 19:32 | #7 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Я сейчас точно не помню, но судя по своему же коду вызов inflateEnd не нужен, ибо возврат из функции идет сразу после проверки (inflate(&m_zstream, Z_FINISH) == Z_STREAM_END)
насколько я помню документацию на злиб, то если вызов inflate завершился кодом Z_STREAM_END, то данные полностью распакованы. В данном случае поскольку нам известна заранее длина распакованных данных, то можно сразу выделять буфер нужной длины. Что у меня в коде и делается, так что строчку с inflateEnd надо удалить нафиг -) |
10.05.2011, 19:52 | #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. |
10.05.2011, 19:56 | #9 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
ну в идеале конечно да
|
10.05.2011, 20:02 | #10 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
а мы разве не к нему стремимся?
|
10.05.2011, 20:07 | #11 | |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Цитата:
Для моего случая этого было достаточно |
|
10.05.2011, 20:16 | #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 |