2

PHP で Gettext MO ファイル ハッシュ テーブルをいじってみました。このオプションのテーブルがどれほど重要かはわかりませんが、MO ファイルを生成するときに、可能であれば完全な仕様を実装していることを確認したいと思います。

Mac と Linux で"","a","b","c"Gettext を使用してエントリを含む単純な PO ファイルをコンパイルしました。msgfmtハッシュ テーブルの長さは 5 バイトですが、奇妙なことに、次のように大部分が null バイトです。01 00 00 00 00

Gettext ソース コードから取得したアルゴリズムを実行すると、01 00 02 03 04代わりにテーブルが生成されます。

ここに私のテストコードがあります : https://gist.github.com/timwhitlock/8255619
(例のPOファイルを含む)

私自身のハッシュ テーブルのコンパイルは間違っている可能性がありますが、最初に、msgfmt で生成された MO ファイルのハッシュ テーブルがほとんどゼロである理由を理解したいのですか?

MOファイルからハッシュテーブルを正しくプルしていると確信しています。spec で概説されているように、6 番目のバイトからテーブルのサイズと位置を取得します。

私の「abc」の例では、二重ハッシュが使用されていないため、テーブルが正しいかどうかに関係なく、そのテーブルがどのように正しいかわかりません。

この「abc」の例の正しいハッシュ テーブルは何ですか?

4

1 に答える 1

1

私はこれを解決しました。

私はばかげて、ハッシュテーブルに各整数を保持するために 1 バイトを使用していました。hash_tab[idx]これは、私の PHP の頭脳が変換した C のようなものを見たことが原因$hash_tab{$idx}で、もちろん間違っていました。それはそのようになりますsubstr($hash_tab,$idx,$idx+4)

また、ハッシュテーブルの「サイズ」が文字列の数であり、バイト長ではないこともわかりませんでした。

サンプル コードが動作するようになりました。私の生成したテーブルは、MO ファイルから取得したものと一致します。

于 2014-01-04T17:39:46.167 に答える