GXT (GTA 4) — различия между версиями
Материал из GTAModding.ru
Seemann (обсуждение | вклад) (подсветка, american.gxt.reversed) |
AleX AciD (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
Бинарные файлы с расширением <code>.gxt</code> используются для хранения текстовых строк на разных языках (для каждого языка свой файл). В упрощённом виде файл состоит из нескольких таблиц, которые содержат наборы пар ключ=значение. | Бинарные файлы с расширением <code>.gxt</code> используются для хранения текстовых строк на разных языках (для каждого языка свой файл). В упрощённом виде файл состоит из нескольких таблиц, которые содержат наборы пар ключ=значение. | ||
− | Формат <code>.gxt</code> файлов для GTA 4 идентичен | + | Формат <code>.gxt</code> файлов для GTA 4 идентичен [[GXT (SA)|формату файлов для GTA San Andreas]]. Основное отличие состоит в алгоритме вычисления хэша строки, а также в длине и наборе символов в идентификаторах. |
==Алгоритм вычисления хэша строки== | ==Алгоритм вычисления хэша строки== |
Версия 01:16, 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