Как скомпилировать хэш-таблицу MO?
Я играл с хэш-таблицами файлов Gettext MO в PHP. Хотя я не уверен, насколько важна эта необязательная таблица, я хотел бы убедиться, что я реализую полную спецификацию, если это возможно, при генерации MO-файлов.
Я скомпилировал простой файл PO с записями "","a","b","c"
используя Gettext msgfmt
на моем Mac, а также на Linux. Хеш-таблица имеет длину 5 байт, но, как ни странно, в основном содержит нулевые байты, как показано ниже: 01 00 00 00 00
Запустив алгоритм, извлеченный из исходного кода Gettext, я создаю таблицу 01 00 02 03 04
вместо.
Вот мой тестовый код:
https://gist.github.com/timwhitlock/8255619 (включая пример PO-файла)
Я не пишу C, но путаюсь в исходном коде GNU Gettext для портирования показанных функций.
Моя собственная компиляция хеш-таблицы вполне может быть неправильной, но чтобы понять, почему я хотел бы сначала понять, почему сгенерированный msgfmt MO-файл имеет хеш-таблицу, в основном нули?
Я почти уверен, что правильно извлекаю хеш-таблицу из файла MO. Я получаю размер и положение таблицы из шестого байта, как указано в спецификации.
В моем примере "abc" двойное хеширование не используется, поэтому я не понимаю, насколько корректна эта таблица, независимо от того, верна ли моя таблица.
Какова правильная хеш-таблица для этого примера abc?
1 ответ
Я решил это.
Я тупо использовал один байт для хранения каждого целого числа в хэш-таблице. Это было связано с тем, чтобы увидеть такие вещи, как hash_tab[idx]
в C, который мой PHP-мозг перевел на $hash_tab{$idx}
что, конечно, неправильно. Это было бы substr($hash_tab,$idx,$idx+4)
Я также не смог увидеть, что "размер" хеш-таблицы - это количество строк, а не длина байта.
Мой пример кода работает сейчас. Моя сгенерированная таблица соответствует той, что извлечена из файла MO