GXT (GTA 4) — различия между версиями

Материал из GTAModding.ru
Перейти к: навигация, поиск
(Новая: Бинарные файлы с расширением <code>.gxt</code> используются для хранения текстовых строк на разных языках (д...)
 
(подсветка, american.gxt.reversed)
Строка 6: Строка 6:
  
 
Для вычисления хэша используется следующая разновидность алгоритма [http://en.wikipedia.org/wiki/Hash_table#Choosing_a_good_hash_function Jenkins One-at-a-time hash]:
 
Для вычисления хэша используется следующая разновидность алгоритма [http://en.wikipedia.org/wiki/Hash_table#Choosing_a_good_hash_function Jenkins One-at-a-time hash]:
 +
<source lang="cpp">
 
  DWORD GetHash(char *szKeyName)
 
  DWORD GetHash(char *szKeyName)
 
  {
 
  {
Строка 37: Строка 38:
 
     return hash;
 
     return hash;
 
  }
 
  }
 
+
</source>
 
Хэш строки вычисляется из идентификатора, представляющего собой ASCIIZ строку переменной длины (предположительно до 32 байт). В идентификаторе допускаются следующие символы:  
 
Хэш строки вычисляется из идентификатора, представляющего собой ASCIIZ строку переменной длины (предположительно до 32 байт). В идентификаторе допускаются следующие символы:  
 
* заглавные латинские буквы ( A-Z )  
 
* заглавные латинские буквы ( A-Z )  
Строка 49: Строка 50:
 
  PB_MISC_02
 
  PB_MISC_02
  
[[Категория: GTA_4]] [[Категория: Форматы файлов]]
+
== Ссылки ==
 +
* [http://public.sannybuilder.com/GTA4/american.gxt.reversed.rar Список частично расшифрованных хэшей]
 +
 
 +
[[Категория: GTA_4]][[Категория: Форматы файлов]]

Версия 01:13, 5 февраля 2009

Бинарные файлы с расширением .gxt используются для хранения текстовых строк на разных языках (для каждого языка свой файл). В упрощённом виде файл состоит из нескольких таблиц, которые содержат наборы пар ключ=значение.

Формат .gxt файлов для GTA 4 идентичен формату файлов для GTA San Andreas. Основное отличие состоит в алгоритме вычисления хэша строки, а также в длине и наборе символов в идентификаторах.

Алгоритм вычисления хэша строки

Для вычисления хэша используется следующая разновидность алгоритма Jenkins One-at-a-time hash:

 DWORD GetHash(char *szKeyName)
 {
     DWORD hash = 0;
     BOOL bQuote = FALSE;
     char ch;
     if(*szKeyName == '"')
     {
         bQuote = TRUE;
         szKeyName++;
     }
     ch = *szKeyName;
     while(ch != '\0')
     {
         if(bQuote != FALSE)
         {
             if(ch == '"')
                 break;
         }
         if((ch >= 'A') && (ch <= 'Z'))  // make lowercase
             ch += 0x20;
         else if(ch == '\\')
             ch = '/';
         hash = (hash + (ch)) * 1025;    // 0x0401
         hash = hash ^ (hash >> 6);
         szKeyName++;
         ch = *szKeyName;
     }
     hash *= 9;
     hash = ((hash >> 11) ^ hash) * 32769;   // 0x8001
     return hash;
 }

Хэш строки вычисляется из идентификатора, представляющего собой ASCIIZ строку переменной длины (предположительно до 32 байт). В идентификаторе допускаются следующие символы:

  • заглавные латинские буквы ( A-Z )
  • символ подчеркивания ( _ )

Перед вычислением хэша идентификатор приводится к нижнему регистру.

Примеры идентификаторов:

BLISTA
GERV4_AIDS_86
PB_MISC_02

Ссылки