2014-01-04 1 views
1

Я играл с хэш-таблицами Gettext MO в PHP. Хотя я не уверен, насколько важна эта дополнительная таблица, я бы хотел убедиться, что при создании файлов MO я реализую полную спецификацию.Как составить таблицу хешей 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 к порту функций, показанных.

Моя собственная сборка хэш-таблицы может быть неправильной, но для того, чтобы понять, почему я хотел бы сначала понять, почему MOG-файл, созданный с помощью msgfmt, имеет хэш-таблицу, в основном, нули?

Я уверен, что правильно вынимаю хэш-таблицу из файла MO. Я получаю размер и положение таблицы с шестого байта как outlined in the spec.

В моем примере «abc» не используется двойное хеширование, поэтому я не понимаю, как эта таблица правильная, независимо от того, правильна ли моя таблица.

Какова правильная таблица хэшей для примера «abc»?

ответ

0

Я решил это.

Я был глупо, используя один байт, чтобы удерживать каждое целое число в хеш-таблице. Это произошло из-за того, что я видел такие вещи, как hash_tab[idx], что мой мозг PHP переведен на $hash_tab{$idx}, что, конечно, неправильно. Это было бы substr($hash_tab,$idx,$idx+4)

Я также не видел, что в хэш-таблице «размер» было количество строк, а не длина байта.

Мой пример кода работает сейчас. Моя сгенерированная таблица соответствует тому, что вытащили из файла MO.