Структура пакета

Menma

Знаменитый
Участник
Старожил I степени
Сообщения
99
Розыгрыши
0
Решения
1
Репутация
41
Реакции
40
Баллы
1 278
Здравствуйте, помогите пожалуйста разобраться.
Есть такой кусок кода с чтением данных из пакеты в переменные.
C++:
Disassemble(packet, "dd", &userDbId, &userObjectId);
Я так понимаю, что это "dd" - спецификаторы? Если да, то где можно посмотреть, какие они вообще есть для пакетов и какие типы обозначают?
Спасибо
 

Есть же исходники - Lineage 2 Essence 3.0 ну или их подобие ввиде PDB, там вроде должны быть энумы которые обозначают тип структуры пакета, к примеру - "d" - decimal число int32, ну если уж не найти энумы, можно посмотреть сам метод Disassemble, там все должно быть ясно .
Хмм у меня вроде даже оставались.

Код:
const unsigned char *Disassemble(const unsigned char* packet, const char* format, ...)
{
    guard(const unsigned char *Disassemble(const unsigned char* packet, const char* format, ...));
 
    const char* f = format;
    va_list ap;
    int t;
    va_start(ap, format);
    while ((t = *format++))
    {
        switch (t)
        {
        case 'c':
            {
                char* cp = va_arg(ap, char*);
                *cp = *packet++;
            }
            break;
        case 'h':
            {
                short* hp = va_arg(ap, short*);
#ifdef _WIN32
                *hp = ((short *)packet)[0];
#else
                *hp = packet[0] + (packet[1] << 8);
#endif
                packet += 2;
            }
            break;
        case 'd':
            {
                int* dp = va_arg(ap, int*);
 
#ifdef _WIN32           // CPU specific optimization.
                *dp = ((int *)packet)[0];
#else
                *dp = packet[0] + (packet[1] << 8) + (packet[2] << 16) + (packet[3] << 24);
#endif
                packet += 4;
            }
            break;
 
        case 'f':
            {
                double* dp = va_arg(ap, double*);
 
#ifdef _WIN32           // CPU specific optimization.
                CopyMemory(dp, packet, 8);
                /*
                int i1 = *(int*)packet;
                int i2 = *(((int*)packet)+1);
                *(((int*)dp)+0) = i2;
                *(((int*)dp)+1) = i1;
                */
                /*
                *dp = ((double *)packet)[0];
                */
#else
                *dp = packet[0] + (packet[1] << 8) + (packet[2] << 16) + (packet[3] << 24)
                    + (packet[4] << 32) + (packet[5] << 40) + (packet[6] << 48) + (packet[7] << 56)
#endif
                packet += 8;
            }
            break;
 
        case 's':
            {
                int dstLen = va_arg(ap, int);
                char* dst = va_arg(ap, char*);
                strncpy(dst, (char*)packet, dstLen);
                dst[dstLen - 1] = 0;
                unsigned char* end = (unsigned char*)StrNChr((char*)packet, '\0', dstLen) + 1;
//        if (end - packet > dstLen) {
//            log.Add(LOG_ERROR, "too long string in %s", f);
//        }
                packet = end;
            }
            break;
        case 'S':
            {
                int len = va_arg(ap, int) / sizeof(wchar_t);
                len = WcsNLen(packet, len-1);
                wchar_t* dst = va_arg(ap, wchar_t*);
                memcpy(dst, packet, len * sizeof(wchar_t));
                dst[len] = 0;
                packet += (len + 1) * sizeof(wchar_t);
            }
            break;
        default:
            Log.Add(LOG_ERROR, L"unknown type %c in %S", t, f);
        }
    }
    va_end(ap);
    return packet;
 
    unguard;
}
 
Код:
---------------------->>>
Info:
Типы данных используемые в пакетах:
c: Byte - 1 байт
h: Word - 2 байта
d: DWord - 4 байта
f: Double - 8 байт
q: Int64 - 8 байт целое
s: String
i: DWord - 4 байта - отведен специально для ItemID
l: DWord - 4 байта - отведен специально для SkillID
o: DWord - 4 байта - отведен специально для ObjectID и CharID
b: Array of Byte - массив байт, записывается в виде: b(Описание:Размер):
------------------------------------------------------------------------------------->>>

c - byte
h - short
d - int
q - long
 
Спасибо. А когда заглавные буквы используют типа "S" или "Q" это как понять?
 
Спасибо. А когда заглавные буквы используют типа "S" или "Q" это как понять?
если речь про обозначения на стороне сервера, то это просто для удобства - как бы к примеру readD/writeD воспринимаются визуально проще чем readd/writed.
 
Здравствуйте, помогите пожалуйста разобраться.
Есть такой кусок кода с чтением данных из пакеты в переменные.
C++:
Disassemble(packet, "dd", &userDbId, &userObjectId);
Я так понимаю, что это "dd" - спецификаторы? Если да, то где можно посмотреть, какие они вообще есть для пакетов и какие типы обозначают?
Спасибо
Дизасемблировать из пакета первые 2 инта(dword) и записать их в ссылки на твои переменные.
 
если речь про обозначения на стороне сервера, то это просто для удобства - как бы к примеру readD/writeD воспринимаются визуально проще чем readd/writed.
хаха )нуда нуда для удобства .
Спасибо. А когда заглавные буквы используют типа "S" или "Q" это как понять?
S Это Widechar , строки с юникод символами, s обычные char , Ansi .
Q это INT64, прописной q вроде нету в пакетах .

я даже не поленился открыл pdb сервака - , там же все есть .

*строчной q ...
 
хаха )нуда нуда для удобства .
ну я про яву вобще-то говорил, не про птс :)
там обычно именно что все заглавными обычно пишется тип данных в write/read - и наглядней и просто как бы camel case написание.
У мобиуса так ща вроде вобще тупо полностью тип пишется, типа writeInt, readShort и т.д.
 
ну я про яву вобще-то говорил, не про птс :)
там обычно именно что все заглавными обычно пишется тип данных в write/read - и наглядней и просто как бы camel case написание.
У мобиуса так ща вроде вобще тупо полностью тип пишется, типа writeInt, readShort и т.д.
В птс функции write(тип) так же записаны у большинства, тут же пример вызова функции дизасемблирования. Она принимает как положено, простые и заглавные.
C++:
 Packet.WriteD(va_arg(tag, DWORD));    //level
     Packet.WriteQ(va_arg(tag, INT64));
 
Назад
Сверху Снизу