Как скомпилировать хэш-таблицу 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

Другие вопросы по тегам