Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
 
 
Опции темы Опции просмотра
Старый 25.10.2020, 22:53   #1
Новичок
 
Регистрация: 31.07.2019
Сообщений: 8
Сказал Спасибо: 5
Имеет 0 спасибок в 0 сообщенях
0day пока неопределено
Восклицание Сериализация Пакета перед отправкой Lineage 2

Не много погуглив, перерыв весь этот форум (возможно упустил что-то), касаемо получения правильного адреса функции SendPacket. Теперь хочу поэкспериментировать над сие чудом, и что собственно скрывается за капотом.

Сразу скажу, что я не гуру и не знаток C++, перейдя с Delphi на C++ у меня есть какой-то опыт работы с типами данных. И я не прошу Вас писать что-то за меня.

Взятый пример из форума функции SendPacket для использования.
Код:
void hSendPck(unsigned int This, char* Format, ...) {

	unsigned char buf[1024];
	int size = 0, len;
	wchar_t* wstr;

	va_list args;
	va_start(args, Format);

	while (*Format != 0)
	{
		switch (*Format)
		{
		case 'c':
			*(unsigned char*)(buf + size) = va_arg(args, unsigned char);
			size++;
			break;
		case 'h':
			*(unsigned short int*) (buf + size) = va_arg(args, unsigned short int);
			size += 2;
			break;
		case 'd':
			*(unsigned int*)(buf + size) = va_arg(args, unsigned int);
			size += 4;
			break;
		case 'Q':
			*(unsigned __int64*)(buf + size) = va_arg(args, unsigned __int64);
			size += 8;
			break;
		case 'b':
			len = va_arg(args, unsigned int);
			memcpy(buf + size, va_arg(args, void*), len);
			size += len;
			break;
		case 'S':
			wstr = va_arg(args, wchar_t*);
			if (wstr == 0)
			{
				len = 2;
				*(unsigned short int*) (buf + size) = 0;
			}
			else
			{
				len = wcslen(wstr) * 2 + 2;
				memcpy(buf + size, wstr, len);
			}
			size += len;
			break;

		}
		Format++;
	}
	va_end(args);
	
	return (*true_SendPacket)(This, "b", size, (int)buf);
}
Нашёл пример из статьи о структуре и сериализации данных здесь https://beej.us/guide/bgnet/html/#serialization

Я увидел хороший пример из этого источника о создании пакета с помощью этого, как и моём случае с отправкой SendPacket.

Код:
unsigned int pack(unsigned char *buf, char *format, ...)
{
    va_list ap;

    signed char c;              // 8-bit
    unsigned char C;

    int h;                      // 16-bit
    unsigned int H;

    long int l;                 // 32-bit
    unsigned long int L;

    long long int q;            // 64-bit
    unsigned long long int Q;

    float f;                    // floats
    double d;
    long double g;
    unsigned long long int fhold;

    char *s;                    // strings
    unsigned int len;

    unsigned int size = 0;

    va_start(ap, format);

    for(; *format != '\0'; format++) {
        switch(*format) {
        case 'c': // 8-bit
            size += 1;
            c = (signed char)va_arg(ap, int); // promoted
            *buf++ = c;
            break;

        case 'C': // 8-bit unsigned
            size += 1;
            C = (unsigned char)va_arg(ap, unsigned int); // promoted
            *buf++ = C;
            break;

        case 'h': // 16-bit
            size += 2;
            h = va_arg(ap, int);
            packi16(buf, h);
            buf += 2;
            break;

        case 'H': // 16-bit unsigned
            size += 2;
            H = va_arg(ap, unsigned int);
            packi16(buf, H);
            buf += 2;
            break;

        case 'l': // 32-bit
            size += 4;
            l = va_arg(ap, long int);
            packi32(buf, l);
            buf += 4;
            break;

        case 'L': // 32-bit unsigned
            size += 4;
            L = va_arg(ap, unsigned long int);
            packi32(buf, L);
            buf += 4;
            break;

        case 'q': // 64-bit
            size += 8;
            q = va_arg(ap, long long int);
            packi64(buf, q);
            buf += 8;
            break;

        case 'Q': // 64-bit unsigned
            size += 8;
            Q = va_arg(ap, unsigned long long int);
            packi64(buf, Q);
            buf += 8;
            break;

        case 'f': // float-16
            size += 2;
            f = (float)va_arg(ap, double); // promoted
            fhold = pack754_16(f); // convert to IEEE 754
            packi16(buf, fhold);
            buf += 2;
            break;

        case 'd': // float-32
            size += 4;
            d = va_arg(ap, double);
            fhold = pack754_32(d); // convert to IEEE 754
            packi32(buf, fhold);
            buf += 4;
            break;

        case 'g': // float-64
            size += 8;
            g = va_arg(ap, long double);
            fhold = pack754_64(g); // convert to IEEE 754
            packi64(buf, fhold);
            buf += 8;
            break;

        case 's': // string
            s = va_arg(ap, char*);
            len = strlen(s);
            size += len + 2;
            packi16(buf, len);
            buf += 2;
            memcpy(buf, s, len);
            buf += len;
            break;
        }
    }

    va_end(ap);

    return size;
}

Моя проблема в состоит в непонимании, где указывать ID пакета? Буду пробовать повторить пакет (взятый с L2PHX) по следующему примеру:
HEX Код:
2F 2B 05 00 00 00 00 00 00 00
Код:
Тип: 0x2F (RequestMagicSkillUse)
Pазмер: 10+2
0002 d  MagicID: 1323 (0x0000052B)
0006 d  CtrlPressed: 0 (0x00000000)
0010 c  ShiftPressed: 0 (0x00)
Я понимаю, что должен сделать приблизительно вот как?
Но в каком месте ID пакета указывать?
Код:
hSendPck(unh, "ddc", 1323, 0, 0);
PS: Прошу прощения за такие вопросы, укажите на ошибки/ что я пропустил.
Исключительно в образовательных целях )

Последний раз редактировалось 0day, 25.10.2020 в 22:57.
0day вне форума   Ответить с цитированием
 

  CoderX :: Forums > Основные форумы > Программинг



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

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


Часовой пояс GMT +4, время: 22:00.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!