Тема: creaturecache.wdb
Показать сообщение отдельно
Старый 09.12.2013, 10:14   #7
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Цитата:
и получаем мусор
Цитата:
там тоже было такое чтение строк и странные операции с длиной строки
ну судя по тому что я отреверсил, то получается так:
Код:
char __thiscall CDataStore__GetSizedString2(int this, int a2, int a3, char a4)
{
    int v4; // edi@1
    int v5; // esi@1

    v4 = a3;
    v5 = this;
    if ( a3 )
    {
        if ( a3 == 1 ) // ответ на вопрос с лишним байтом
        {
            *(_DWORD *)(this + 4) &= 0xFE000000u;
            *(_DWORD *)this = &unk_D115FF;
        }
        else
        {
            CDataStore__GetData(a2, (int)&a3, a3);
            if ( !a3 || *(_BYTE *)(v4 - 1 + a3) )
                return 0;
            if ( a4 )
            {
                *(_DWORD *)v5 = a3;
                *(_DWORD *)(v5 + 4) = *(_DWORD *)(v5 + 4) & 0xFE000000 | (unsigned int)&unk_FFFFFF & (v4 - 1);
            }
            else
            {
                sub_A45D2C((void *)v5, a3, v4 - 1);
            }
        }
    }
    return 1;
}
сделал так:
Код:
public string ReadString2(int m_size)
{
    if (m_size <= 1)
        return string.Empty;

    var str = Encoding.UTF8.GetString(buffer, index, m_size - 1);
    index += (int)m_size;
    return str;
}
в итоге все прочиталось без мусора,
прикладываю исходники
Вложения
Тип файла: rar WdbCreatureCacheReader.rar (11.7 Кб, 6 просмотров)
__________________

Последний раз редактировалось Konctantin; 09.12.2013 в 10:32.
Konctantin вне форума   Ответить с цитированием
3 пользователя(ей) сказали cпасибо:
Amaru (10.12.2013), blackmanos (11.12.2013), YuruY (10.12.2013)