GXT (GTA 4) — различия между версиями
Материал из GTAModding.ru
AleX AciD (обсуждение | вклад) (Новая: Бинарные файлы с расширением <code>.gxt</code> используются для хранения текстовых строк на разных языках (д...) |
Seemann (обсуждение | вклад) (подсветка, 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