Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Опкоды, Формулы, Клиент > Опкоды

Важная информация

Опкоды Опкоды

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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
alien
Ученый
 
Регистрация: 17.05.2010
Сообщений: 148
Сказал(а) спасибо: 18
Поблагодарили 25 раз(а) в 22 сообщениях
alien На верном пути
По умолчанию

Дак тамже простейший zlib.
Или ты не про это?
alien вне форума   Ответить с цитированием
Старый 18.07.2010, 15:11   #3
Йоха
Умный
 
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
Йоха Скоро придёт к известности
По умолчанию

Про то.
Просто я никогда не использовал zlib библиотеку и не знаю что там с чем едят
Йоха вне форума   Ответить с цитированием
Старый 10.05.2011, 19:02   #4
Minimajack
Гость
 
Сообщений: 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
RomanRom2
WowCore Dev
 
Аватар для RomanRom2
 
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
RomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всем
По умолчанию

спросил бы
все правильно сделал. только inflateEnd надо еще на Z_OK проверять.
RomanRom2 вне форума   Ответить с цитированием
Старый 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
RomanRom2
WowCore Dev
 
Аватар для RomanRom2
 
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
RomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всем
По умолчанию

представь, что будет, если тебе придется обрабатывать битый пакет или пакет с ошибками Lordronn
проверять надо всё, включая переполнения буфера и inflateEnd.

и вообще строго говоря, кто сказал что надо сразу inflate(&m_zstream, Z_FINISH) вызывать? пакеты с ачивками в волке очень большие могут быть. размер m_zstream.avail_out делать больше одной страницы - не по феншую как бэ... но можно. в спецификации там WORD был вроде (тоже не помню), но я пробовал и longword в полмега и распаковывается все за один раз без проблем в принципе. но в таких случаях могут возникать ошибки stack overflow когда прога разрастется и хрен ты их найдешь сходу

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

ну в идеале конечно да
Йоха вне форума   Ответить с цитированием
Старый 10.05.2011, 20:02   #10
RomanRom2
WowCore Dev
 
Аватар для RomanRom2
 
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
RomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всем
По умолчанию

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

Цитата:
Сообщение от RomanRom2 Посмотреть сообщение
и вообще строго говоря, кто сказал что надо сразу inflate(&m_zstream, Z_FINISH) вызывать? пакеты с ачивками в волке очень большие могут быть. размер m_zstream.avail_out делать больше одной страницы - не по феншую как бэ... но можно. в спецификации там WORD был вроде (тоже не помню), но я пробовал и longword в полмега и распаковывается все за один раз без проблем в принципе. но в таких случаях могут возникать ошибки stack overflow когда прога разрастется и хрен ты их найдешь сходу
С этим тоже согласен, у меня сперва была такая мысля, сделать универсальную функцию которая корректно обрабатывала бы данные любого размера, но потом решил не заморачиваться и оставить как есть
Для моего случая этого было достаточно
Йоха вне форума   Ответить с цитированием
Старый 10.05.2011, 20:16   #12
Lordronn
Умный
 
Регистрация: 17.06.2010
Сообщений: 397
Сказал(а) спасибо: 58
Поблагодарили 55 раз(а) в 38 сообщениях
Lordronn Скоро придёт к известности
По умолчанию

Lordronn вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[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


Текущее время: 02:10. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot