LHAの書庫構造
 LHAの書庫構造は、一つのファイルに対して、 ヘッダ情報と圧縮データ部の組が一つ存在し、 書庫に入っているファイルの数だけ、 この組が繰り返して格納されています。

 ヘッダ情報には、ファイルの名前、サイズ、属性、更新時間、 圧縮法等が記録されています。このヘッダ情報の後に、 LHAによって圧縮されたファイルのデータが格納されています。 この圧縮されたファイルのデータの後には、 次のファイルのヘッダ情報の部分がきます。 あとは、この繰り返しになっています。

lzh archived structure
図1:LZH書庫構造

 この「ヘッダ+圧縮データ」というシンプルな仕様のため、 書庫に入っている全てのファイル名を表示するときは、 ヘッダを次々と辿っていく必要があります。

 しかし、一つのファイルで一つの「ヘッダ+圧縮データ」が存在し、 他のファイルとは関係が無いので、書庫のファイルのヘッダが壊れていても、 壊れたヘッダの圧縮ファイルのみを失うだけで済みます。

LHAのヘッダ
 LHAのヘッダには、3種類のヘッダが存在します。 '88年頃にLHAの前バージョンのLHarcがありました。 このLHarcが使っていたヘッダ形式と互換のあるヘッダがレベル0ヘッダです。 このヘッダで作成した書庫は、LHarcでも見ることはできますが、 LHarcで解凍できる圧縮法である必要があります。

 レベル0ヘッダは最大257バイトまでの制約があります。 MS-DOS以外のOSで使う場合に、ファイル名の長さやOS独自のファイル情報の関係で、 レベル0ヘッダでは不足になってきました。 そこで、レベル0ヘッダを拡張する必要が出てきたのですが、 完全に新しいヘッダ形式を採用すると、 今までのLZH書庫を扱う数多くのユーティリティーが、 使えなくなる恐れがあります。そこで、新しいヘッダが行き渡るまで、 今までのLZH書庫を扱うユーティリティーでも最低限、 書庫が読める(ファイル名だけが読み取れる)形のヘッダにしたのが レベル1ヘッダ です。 レベル1ヘッダは、 基本ヘッダと拡張ヘッダに分かれていて、 基本ヘッダ部分はレベル0ヘッダと互換性があります。 機種依存しそうな情報は、拡張ヘッダで表すことになっています。

 新しいヘッダの形式は、 レベル2ヘッダです。 レベル0、レベル1のヘッダとは全く互換性はありません。 レベル2ヘッダは、レベル1ヘッダと同様、 基本ヘッダと拡張ヘッダに分かれています。 拡張ヘッダは、レベル1で使われるものと同様の形式です。 ファイル名やディレクトリ名は全て拡張ヘッダで表すことになっています。 また、ファイル更新日時はUNIX形式で書くことになっています。

 バイト並びはLittle Endianになっています。 つまり、80x86系のCPUのメモリ格納形式のように、 下位バイト+上位バイトの順で格納されます。

 ということで、各ヘッダレベルの詳細な解説と、 その他の情報は

レベル0ヘッダ
レベル1ヘッダ
レベル2ヘッダ
拡張ヘッダ
OS識別子
UNIXに特化した話
を参照してください。
(C)Copyright 1996, t.okamoto.