ebzip コマンド

この文書は EB ライブラリバージョン に対応しています。

目次:

Copyright (c) 1998-2006 Motoyuki Kasahara

はじめに

ebzip は EB ライブラリのアプリケーション用に、CD-ROM 書籍の 圧縮・伸長を行います。 EB ライブラリのアプリケーションは、機能的には何の制限もなく圧縮された CD-ROM 書籍にアクセスできます (ただし、処理速度はもとの書籍に比べて遅 くなるかも知れません)。 圧縮データ形式は、CPU の種類や、OS、ファイルシステムには依存していませ んので、ebzip で圧縮したファイルは共用が可能です。 ebzip は EB ライブラリと一緒に配布されています。

あなたは、自分の所有する CD-ROM 書籍の使用許諾を守らなくてはいけません。 ebzip はフリーソフトウェアですが、あなたの書籍が自由に使える ものであるとは限りません。 CD-ROM 書籍の出版社がハードディスク (および他の補助記憶装置) に書籍を コピーすることを許可していないのであれば、その書籍の圧縮は諦めて下さい。

動作とコマンド名

ebzip は三つの 動作 (action) モードを 備えています。 圧縮 (compression)、伸長 (uncompression) と情報出力 (information) です。

ebzip は起動時に、起動時に使用されたコマンド名と コマンドラインオプションから動作モードを決定します。 ebzip の一回の実行の間で、動作モードが変わることは ありません。

ebzipebzipebunzip, ebzipinfo という異なる 3 つのコマンド名でインストール されます。 (一部の環境では、ebzipinfoebzipinf という名前になっています。)

ebunzip という名前で起動された場合は、伸長を行います。 ebzipinfo という名前で起動された場合、情報出力を行います。 それ以外の場合は、圧縮を行います。

コマンドラインオプションでも、動作モードを決定することができます。 --compress (-z) で圧縮、--uncompress (-u) で伸長、--information (-i) で情報出力を行います。 オプションは、起動時のコマンド名より優先します。 次の例では、いずれも動作モードが「伸長」になります。

ebunzip
ebzip --uncompress
ebzipinfo --uncompress

遠隔アクセスには対応していませんので、遠隔アクセス識別子は使用できません。

% ebzip ebnet://localhost/cdrom
ebzip: ebnet には対応していません。

ebzip の実行

ebinfoebunzipebzipinfo の 一般的な起動方法は次の通りです。

% ebzip 書籍へのパス
% ebunzip 書籍へのパス
% ebzipinfo 書籍へのパス

書籍へのパス には、CD-ROM 書籍のトップディレクトリ、つまり catalog または catalogs ファイルが存在する ディレクトリを指定します。 複数のパスを書くことはできませんが、以下のように、パスの指定を省くことは できます。

% ebzip
% ebunzip
% ebzipinfo

この場合は、カレントディレクトリ (.) が指定されたものと 判断されます。

圧縮

ebzip (ebunzip --compressebzipinfo --compress と等価) は CD-ROM 書籍の圧縮を行います。

圧縮の実行例 (1)

この節では、ハードディスクにすでにコピーしてある CD-ROM 書籍を圧縮するには どうしたらいいかを説明します。 CD-ROM 書籍がすでに /dict にコピーされているものの、まだ圧縮 されていないと仮定します。 この書籍は /dict の下に、次のようなファイルを持っています。

/dict/catalog
/dict/language
/dict/kanji/start
/dict/english/start

この書籍を圧縮するには、次のようにします。

% cd /dict
% ebzip

これは次のようにしても同じです。

% ebzip --output-directory /dict /dict

圧縮には、しばらくかかることがあります。 圧縮の間、ebzip は、次のように状況を知らせるメッセージを出力 します。

==> /dict/kanji/start を圧縮 <==
./dict/kanji/start.ebz に出力
 1.0% 処理済み (2097152 / 220069888 バイト)
 1.9% 処理済み (4194304 / 220069888 バイト)
 2.9% 処理済み (6291456 / 220069888 バイト)
        : (略)
完了 (220069888 / 220069888 バイト)
220069888 -> 78163751 バイト (35.5%)

圧縮が完了すると、/dict の下のディレクトリ構成が少し変化して いるのが分かります。

/dict/catalog
/dict/language.ebz
/dict/kanji/start.ebz
/dict/english/start.ebz

拡張子 .ebz がいくつかのファイル (/dict/language.ebz/dict/kanji/start.ebz/dict/english/start.ebz) に付いています。 これらが圧縮されたファイルです。 他のファイルは変化していません。

ebzip が圧縮するファイルは、 STARTHONMONHONMON2HONMONSLANGUAGE ファイルと GAIJI ディレクトリにある外字ファイルです。

圧縮の実行例 (2)

この節ではもう一つ別の例として、CD-ROM ディスクのファイルを圧縮し、それ をハードディスクに置く方法について説明します。 元の CD-ROM 書籍が /cdrom にマウントされ、書籍は /cdrom の下に次のようなファイルを持っていると仮定します。

/cdrom/catalog
/cdrom/language
/cdrom/german/start
/cdrom/french/start
/cdrom/italian/start

この書籍を圧縮し、/dict の下に置くためには、次のコマンドを 実行します。

% cd /dict
% ebzip --keep /cdrom

これは次のようにしても同じです。

% ebzip --keep --output-directory /dict /cdrom

出力側のディレクトリ /dict は空でも構いませんが、圧縮前に あらかじめ作っておかなければならないので、注意して下さい。 この例では、--keep オプションを使っています。 特に指定しなければ、ebzip は、圧縮後に元のファイルを削除 しますが、--keep オプションはこの振る舞いを抑制します。

/dict/cdrom のディレクトリ構成はほとんど 同じですが、/dict の下の圧縮されたファイルには拡張子 .ebz が付いています。

/dict/catalog
/dict/language.ebz
/dict/german/start.ebz
/dict/french/start.ebz
/dict/italian/start.ebz

中間のディレクトリ /dict/german/dict/french/dict/italian は、もし無ければ ebzip によって 作成されます。 catalogcatalogs は、出力側のディレクトリ にコピーされます。 EB ライブラリが対応していないファイル、ディレクトリについては、 ebzip は無視します (圧縮もコピーもしません)。

圧縮レベル

ebzip は、0 〜 5 という 6 つの圧縮レベルを持っています。 圧縮レベル 0 は、圧縮・伸長が最も速いですが、圧縮率は最悪です。 圧縮レベル 5 は、圧縮率が最良ですが、圧縮・伸長は最も遅くなります。 圧縮レベルは、--level (-l) オプションで設定します。

% ebzip --level 2 --output-directory /dict /dict

無指定時のレベルは 0 (最速だが圧縮率は最悪) です。

テスト

ebzip--test (-t) オプション付き で実行すると、ebzip は圧縮したデータを実際のファイルには 書き込まなくなります。 圧縮する前に圧縮後のファイルの大きさを知りたいときに、便利です。

% ebzip --test /dict /dict

一部だけの圧縮

なにも設定しないと、ebzip は書籍一冊の全体を圧縮しますが、 --subbook (-S) や --skip-content (-s) オプションを使うと一部だけを圧縮できます。

--subbook オプションは引数を一つ取り、そこにカンマ (,) で区切って、圧縮したい副本のディレクトリ名を並べて 書きます。 ebinfo コマンドを用いると、あなたの所有している書籍に どのような副本が含まれているのかを知ることができます。

% ebinfo /mnt/cdrom
ディスクの形式: EB/EBG/EBXA/EBXA-C/S-EBXA
文字コード: JIS X 0208
副本の数: 3

副本 1:
  題名: 新英和辞典(第四版)
  ディレクトリ: english
  検索方式: 前方一致 後方一致 条件 メニュー
  フォントの大きさ: 16 24 30 48
  半角フォントの文字: 0xa121 -- 0xa24e
  全角フォントの文字: 0xa321 -- 0xa27e

副本 2:
  題名: CD-ROM 仏和辞典(第三版)
  ディレクトリ: french
  検索方式: 前方一致 後方一致 条件 メニュー
  フォントの大きさ: 16 24 30 48
  半角フォントの文字: 
  全角フォントの文字: 0xa321 -- 0xa27e

副本 3:
  題名: ポケット独和辞典(第三版)
  ディレクトリ: german
  検索方式: メニュー
  フォントの大きさ: 16 24 30 48
  半角フォントの文字: 
  全角フォントの文字: 0xa321 -- 0xa27e

(ebinfo コマンドに関しての詳細は、 ebinfo コマンドのマニュアル を参照のこと。) この例では、3 つの副本が書籍には含まれており、それらのディレクトリ名は english, french, german だということが分かります。

englishgerman だけを圧縮するには、次の ようにします。

% ebzip --subbook english,french /dict

ディレクトリ名の大文字、小文字の違いは無視されます。 --subbook の引数は、次のように分けて書くこともできます。

% ebzip --subbook english --subbook french /dict

残りの副本 (この例では german) のファイルは圧縮されることも コピーされることもありませんので、この時点ではまだこの書籍に対する圧縮の 作業は完了していません。 この書籍を使用するためには、さらなる操作を行って残りの副本を圧縮するか、 ebrefile コマンドを使って残りの副本を catalog(s) ファイルの副本登録リストから削除しなくてはなりません (ebrefile コマンドについて詳しくは、 ebrefile コマンド のマニュアル の「ebzip との連携」項を参照のこと)。

副本の一部ずつを複数回に分けて圧縮する場合、すべての副本で同じ圧縮レベル を指定する必要はありません。 (たとえば、englishfrench はレベル 0 で圧縮し、 german はレベル 2 で圧縮する)。

--skip-content (-s) は --subbook に似ていますが、--skip-content では無視するファイルの データ型を指定します。

% ebzip --skip-content sound,movie --subbook french /dict

この例では、ebzip は音声と動画ファイルを飛ばします。 現在のところ、ebzip によって認識されるデータ型は、 次の通りです。

古いファイルの上書き

書き込もうとしたファイルがすでに存在するとき、ebzip は 上書きして良いかどうかの確認を求めてきます。

==> /dict/science/data/honmon を圧縮 <==
/dict/science/data/honmon.ebz に出力

ファイルがすでに存在します: /dict/science/data/honmon.ebz
上書きしますか (はい:y, いいえ:n)?

yn で答えて下さい。 n と答えると、ebzip はそのファイルを飛ばして、 次に進みます。

--force-overwrite オプションを指定すると、ebzip はすでに存在しているファイルを、確認なしに上書きします。 同様に、--no-overwrite オプションを指定すると、 ebzip は確認なしにそのファイルを飛ばして次に進みます。

圧縮された書籍の圧縮

S-EBXA および EPWING 規格においても圧縮形式を定義しており、CD-ROM 書籍 にはこれらの圧縮形式を実際に採用しているものがあります。 これらの圧縮形式は、ebzip の圧縮形式とは異なるものです。

ebzip は S-EBXA や EPWING 圧縮形式で圧縮された CD-ROM 書籍も 伸長することができますが、圧縮することはできません。

ebzip に対して、既に圧縮されている CD-ROM 書籍を圧縮するように 命じると、ebzip はいったん書籍を伸長してから、ebzip の圧縮形式で 圧縮し直します。

一般に ebzip の圧縮形式の方が S-EBXA や EPWING の圧縮形式よりも圧縮率が 良好です。

伸長

ebunzip (ebzip --uncompressebzipinfo --uncompress と同じ) は、ebzip で 圧縮した CD-ROM 書籍を伸長します。

伸長の実行例

伸長の処理手順は、圧縮とかなり似ています。 /dict の下に圧縮された書籍が置かれているものと仮定します。 この書籍には、/dict の下に次のようなファイルを持っています。

/dict/catalog
/dict/language.ebz
/dict/kanji/start.ebz
/dict/english/start.ebz

この書籍を伸長するには、次のコマンドを実行します。

% cd /dict
% ebunzip

これは次のようにしても同じです。

% ebunzip --output-directory /dict /dict

伸長には、しばらくかかることがあります。 伸長の間、ebunzip は、次のように状況を知らせるメッセージを出力 します。

==> /dict/kanji/start.ebz を伸長 <==
./kanji/start.ebz に出力
 5.1% 処理済み (4194304 / 82460672 バイト)
10.2% 処理済み (8388608 / 82460672 バイト)
15.3% 処理済み (12582912 / 82460672 バイト)
        : (略)
完了 (82460672 / 82460672 バイト)
25681439 -> 82460672 バイト

伸長の間、ebunzip は、すでに存在するファイルを上書きしても良いか どうか確認を求めてきます。

==> /dict/kanji/start.ebz を伸長 <==
/dict/kanji/start に出力

ファイルがすでに存在します: /dict/kanji/start
上書きしますか (はい:y, いいえ:n)?

伸長が完了すると、/dict の下のディレクトリ構成は少し変化して います。

/dict/catalog
/dict/language
/dict/kanji/start
/dict/english/start

伸長されたファイルはファイル名が変化し、 拡張子 .ebz が取り除かれています。

伸長のオプション

多くのオプションは、圧縮時と伸長時とで同じ意味を持っています。

--keep オプションを指定すると、ebunzip は、 伸長した後に圧縮ファイルを削除しなくなります。

--test オプションを指定すると、ebunzip は伸長 したデータを実際のファイルには書き込みません。 このオプションは、ファイルが正しく圧縮されているのかを確認するときに便利 です (--test オプションについての詳細は、 「テスト」を参照のこと)。

--subbook--skip-content オプションを指定 すると、条件に合致したファイルだけしか伸長しません (これらのオプションについての詳細は、 「一部だけの圧縮」 を参照のこと)。

--force-overwrite--no-overwrite オプション を指定すると、ebunzip は上書きしても良いかどうかの確認なしに、 ファイルを上書きしたり飛ばして次に進んだりします (--force-overwrite--no-overwrite オプション についての詳細は、 「古いファイルの上書き」 を参照のこと)。

ebunzip は、--level オプションを無視します。 伸長時に --level オプションを指定する必要はありません。

圧縮された書籍の伸長

S-EBXA および EPWING 規格でも圧縮形式を定義しており、CD-ROM 書籍には これらの圧縮形式を実際に採用しているものがあります。 しかし、S-EBXA や EPWINGの圧縮形式は、ebzip の圧縮形式とは異なります。

ebzip は S-EBXA や EPWING 圧縮形式で圧縮された CD-ROM 書籍も 伸長することができますが、圧縮することはできません。

S-EBXA 形式で圧縮された START ファイルや、EPWING 形式で圧縮 された HONMON2, HONMONS ファイルを伸長すると、 伸長後のファイルには拡張子 .org が付加されます (例: honmon2honmon2.org)。

情報出力

ebzipinfo (ebzip --information ebunzip --information と同じ) は CD-ROM 書籍の圧縮状態を出力 します。

情報出力の実行例

/dict にある、圧縮された CD-ROM 書籍の情報を出力するには 次のコマンドを実行します。 /dict に置かれている、圧縮された CD-ROM 書籍の情報を出力 するには、次のようにします。

% ebzipifo /dict

ebzipinfo は標準出力に次のような情報を出力します。

==> /dict/spanish/spanish/start.ebz <==
154290176 -> 54881862 バイト (35.6%, ebzip 圧縮レベル 0)

==> /dict/spanish/language.ebz <==
compressed: 12288 -> 4121 バイト (33.5%, ebzip 圧縮レベル 0)

==> /dict/spanish/catalog <==
2048 バイト (非圧縮)

情報出力のオプション

--subbook--skip-content オプションを 指定すると、条件に合致したファイルの情報だけを出力します (これらのオプションについての詳細は、 「一部だけの圧縮」を参照のこと)。

ebzipinfo--force-overwrite--keep--level--no-overwrite--output-directory--quiet--silence--test オプションを無視します。

書籍の削除

ebzip は、ハードディスク上に圧縮した辞書の削除機能は持って いません。 代わりに rm コマンドを使って下さい。

% rm -r /dict

この作業は、注意して行って下さい。

ebzip のオプション一覧

ebzip コマンドは、伝統的な一文字オプション名と覚えやすい長い オプション名の両方を扱うことができます。 長いオプション名を表すには、- ではなく -- を 用います。 オプション名が一意に決まる範囲内で、名前の後方部分を省略することができます。

-f
--force-overwrite
確認を求めずに、既に存在しているファイルを上書きします。 このオプションは、情報出力の動作のときや、--test (-t) オプションを指定したときは無視されます (詳しくは、「古いファイルの上書き」 を 参照のこと)。
-h
--help
ヘルプメッセージを標準出力に出力して、終了します。
-i
--information
指定された CD-ROM 書籍の圧縮状態を出力します (詳しくは、 「情報出力」 を参照のこと)。
-k
--keep
出力側のファイルを書き込み終わっても、対応する入力側のファイルは 削除しません。 このオプションは、情報出力の動作のときや、--test (-t) オプションを指定したときは無視されます (詳しくは、「圧縮の実行例 (2)」 を参照のこと)。
-l 整数
--level 整数
圧縮レベルを指定します。 整数 は、012345 のいずれかでなくては いけません。 レベル 0 は、最も速いものの圧縮率は最悪です。 レベル 3 は、最も遅いものの圧縮率は最良です。 指定しなかったときのレベルは 0 です。 このオプションは、圧縮以外の動作のときは無視されます。 (詳しくは、「圧縮レベル」 を参照のこと。)
-n
--no-overwrite
既に存在するファイルがあった場合、上書きの確認を求めずに、そのファイル は飛ばして次のファイルに進みます。 このオプションは、情報出力の動作のときや、--test (-t) オプションを指定したときは無視されます。 (詳しくは、「古いファイルの上書き」 を参照のこと。)
-o ディレクトリ
--output-directory ディレクトリ
出力側のファイルを置くディレクトリを指定します。 指定しなかったときは、カレントディレクトリ (.) になります。 このオプションは、情報出力の動作のときや、--test (-t) オプションを指定したときは無視されます
-q
--quiet
--silence
情報、警告メッセージを出力しません。 ただし、圧縮・伸長時に出力側のファイルが既に存在していると、 ebzip はその出力側のファイルを上書きして良いかどうか 訊いてきます。 この質問を抑制するには、--force-overwrite(-f) または --no-overwrite(-n) を指定して下さい。 このオプションは、情報出力の動作のときは、無視されます
-s
--skip-content
無視するファイルのデータ型を指定します。 は、データ型の名前をカンマ (,) で区切って 並べたものでなくてはいけません。 ebzip が現在のところ認識するデータ型の名前は、 font (外字のフォント)、graphic (画像データ)、 sound (音声データ)、movie (動画データ) です。 指定しなかったときは、どのファイルも無視されません。
-S 副本
--subbook 副本
圧縮・伸長・情報出力の対象とする副本を指定します。 副本 は、副本のディレクトリ名をカンマ (,) で 区切って並べたものでなくてはいけません。 指定しなかったときは、すべての副本が対象になります。 (詳しくは 「一部だけの圧縮」 を参照 のこと。)
-t
--test
圧縮・伸長したデータを、実際のファイルには書き込みません。 このオプションは、情報出力の動作のときは無視されます。 (詳しくは 「テスト」 を参照のこと。)
-u
--uncompress
CD-ROM 書籍を伸長します。 (詳しくは 「伸長」 を参照のこと。)
-v
--version
バージョン番号を標準出力に出力して、終了します。
-z
--compress
CD-ROM 書籍を圧縮します。 (詳しくは 「圧縮」 を参照のこと。)

圧縮結果の例

次の表は、ある英和・和英辞典 (EBXA) の START ファイルを 圧縮した結果:

圧縮レベル ファイルサイズ 圧縮率
(元のファイル) 154476544 bytes 100.0%
レベル 0 54922039 bytes 35.6%
レベル 1 49615791 bytes 32.1%
レベル 2 45983464 bytes 29.8%
レベル 3 43431397 bytes 28.1%
(参考: gzip -6) 38712247 bytes 25.0%

ある英々辞典 (EBG) の START ファイルを圧縮した結果:

圧縮レベル ファイルサイズ 圧縮率
(元のファイル) 55511040 bytes 100.0%
レベル 0 25866491 bytes 46.6%
レベル 1 24419066 bytes 44.0%
レベル 2 23453212 bytes 42.2%
レベル 3 22748840 bytes 41.0%
(参考: gzip -6) 20930009 bytes 37.7%

ある国語辞典 (EPWING V1) の HONMON ファイルを圧縮した結果:

圧縮レベル ファイルサイズ 圧縮率
(元のファイル) 23642112 bytes 100.0%
レベル 0 9927048 bytes 42.0%
レベル 1 9213184 bytes 39.0%
レベル 2 8767603 bytes 37.1%
レベル 3 8495563 bytes 35.9%
(参考: gzip -6) 8114658 bytes 34.3%

ある国語辞典 (EPWING V5) の HONMON2 ファイルを圧縮した結果:

圧縮レベル ファイルサイズ 圧縮率
(非圧縮) 220069888 bytes 100.0%
(元のファイル) 149139690 bytes 67.8%
レベル 0 82973263 bytes 37.7%
レベル 1 78163751 bytes 35.5%

ある百科事典 (S-EBXA) の START ファイルを圧縮した結果:

圧縮レベル file size ratio
(非圧縮) 225140735 bytes 100.0%
(元のファイル) 176467968 bytes 78.4%
レベル 0 146045331 bytes 64.9%
レベル 1 138137218 bytes 61.4%

圧縮ファイルの形式

この章では、ebzip が扱っている圧縮ファイル形式の詳細について説 明します。

圧縮ファイル形式の概要

圧縮ファイル形式は次のような特徴を持っています。

圧縮されたファイルは、ヘッダ部、インデックス部、およびデータ部から構成 され、この順でファイルに配置されます。

+--------+-------------+-----------------------------+
| ヘッダ |インデックス |          データ             |
+--------+-------------+-----------------------------+
                                                     EOF

データ部

元のファイルは、次の行程で圧縮されます。

まず、ebzip は元のファイルを分割します。 個々の スライス (slice) は、末尾のものを除けば、 同じ大きさになっています。

+---------------+---------------+--   --+----------+
|  スライス 1   |  スライス 2   |  ...  |スライス N|
+---------------+---------------+--   --+----------+
                                                  EOF

スライス・サイズは、圧縮レベルから決まります (圧縮レベルについては 「圧縮レベル」を 参照のこと)。

圧縮レベル スライスの大きさ
0 2048 バイト
1 4096 バイト
2 8192 バイト
3 16384 バイト
4 32768 バイト
5 65536 バイト

次に、末尾のスライスがスライス・サイズよりも短かった場合、 ebzip はスライス・サイズと同じになるまで伸ばし、伸ばした 部分に 0x00 を埋めます。

                                                 伸した部分
+---------------+---------------+--   --+---------+-----+
|  スライス 1   |  スライス 2   |  ...  |  スライス N   |
+---------------+---------------+--   --+---------+-----+
                                                        EOF

最後に、ebzip は個々のスライスを、RFC 1951 に記されている DEFLATE 圧縮データ形式で圧縮します。 おのおののスライスは、他のスライスとは独立して圧縮されます。 圧縮されたスライスのビット数が 8 の倍数でなければ、1 〜 7 ビットを圧 縮されたスライスの末尾に足し、8 の倍数になるようにします。 これにより、圧縮されたそれぞれのスライスはバイトの境界から開始されます。 足されたビットの内容は未定義ですが、このビットは決して使用されません。

+------------+----------+--   --+--------------+
| 圧縮された |圧縮された|  ...  |  圧縮された  |
| スライス 1 |スライス 2|  ...  |  スライス N  |
+------------+----------+--   --+--------------+

これが圧縮ファイル形式における データ部 になり、圧縮された スライスから構成されます。

末尾のスライスの伸ばした部分は、末尾のスライスの一部として圧縮され ます。 ebunzip が末尾のスライスを復元するときは、スライスを伸長して から伸ばした部分を取り除くという作業を行います。

圧縮したスライスの大きさが、スライス・サイズよりも大きいか等しいときは、 ebzip はそのスライスの圧縮データを廃棄します。 この場合、ebzip は元のデータをそのスライスの圧縮データとして 代わりに記録します。

元のファイルが空だったときは、圧縮ファイルのデータ部はありません。

インデックス部

圧縮時に、ebzip は圧縮した個々のスライスの インデックス (index) を記録します。 個々のインデックスは、圧縮ファイルの先頭から圧縮されたスライスの先頭 までの距離を表します。 距離の単位はバイトです。

+---------+---------+--           --+---------+---------+
|インデッ |インデッ |  ...........  |インデッ |インデッ |
|クス 1   |クス 2   |  ...........  |クス N   |クス END |
+---------+---------+--           --+---------+---------+
     |         |                        |         |
 +---+         +----+                   +------+  +-----------+
 V                  V                          V              V
+------------------+------------------+--   --+--------------+
|    圧縮された    |    圧縮された    |  ...  |  圧縮された  |
|    スライス 1    |    スライス 2    |  ...  |  スライス N  |
+------------------+------------------+--   --+--------------+

個々のインデックスは 2 〜 5 バイトの大きさを持ちます。 インデックスの大きさは、元のファイルの大きさで決まります。

元のファイルの大きさ インデックスの大きさ
0 〜 65535 バイト 2 バイト
65535 〜 16777215 バイト 3 バイト
16777216 〜 4294967295 バイト 4 バイト
4294967296 〜 1099511627775 バイト 5 バイト

インデックス内での、複数バイトからなる数値はすべて、値の大きい方の部分 を表すバイト (most significant byte) が先に来た形で記録されます。 たとえば、0x1234 は次のように記録されます。 最初のバイトは 0x12 となり、次のバイトは 0x34 になります。

+---------+---------+
|0001 0010|0011 0100|
+---------+---------+
  (0x12)    (0x34)

インデックス部は、圧縮されたスライス 1 のインデックスで始まり、その後ろ に圧縮されたスライス 2 のインデックスが続きます。 圧縮されたスライス N のインデックスの後ろには、「終端」へのインデックス が置かれます。 このインデックスは、圧縮されたスライス N の末尾の次のバイトへの インデックスになります。 また、圧縮されたファイルのサイズを示すことにもなります。

+---------+---------+--           --+---------+---------+
|インデッ |インデッ |  ...........  |インデッ |インデッ |
|クス 1   |クス 2   |  ...........  |クス N   |クス END |
+---------+---------+--           --+---------+---------+

圧縮されたスライスの大きさがスライスサイズに等しいときは、そのスライス のデータは実際には圧縮されていないことを示します。

元のファイルが空だったときは、インデックス部はインデックスを一つだけ 持ちます。 このインデックスは圧縮されたファイルの大きさを表します。

ヘッダ部

ヘッダ部は 22 バイトからなります。 次のフィールドから構成されます。

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| マジック ID  |*1| *2  |ファイルの大きさ | Adler-32  | 修正時刻  |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
 0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20 21

*1: zip モードと圧縮レベル
*2: 予約領域
マジック ID (5 バイト)
0x45, 0x42, 0x5a, 0x69, 0x70 (ASCII 文字列で表すと EBZip) という固定した値を持ちます。
zip モード (MSB 側の 4 ビット)
圧縮モードを表します。 元の (非圧縮時の) ファイルの大きさが 4294967295 バイト (= 4Gバイト) 以内のときは 1 (2 進数で 0001)、それより大きいときは 2 (2 進数で 0002) をセットします。

ファイルの大きさで値が変わるのは、歴史的な事情によります。 以前の EB Library は圧縮モード 1 しか既定しておらず、また 4GB バイト を超えるファイルを扱えませんでした。 4G バイトを超えるファイルを扱えるように EB Library を改良した際に、 「4G バイトを超えたら、圧縮モードは 2 にセットする」というルールを 新たに設けました。 これにより、以前の EB Library で 4GB バイトを超えたファイルを扱おう とすると、非対応の圧縮モードとみなされ、エラーが発生するようになって います。

圧縮レベル (LSB 側の 4 ビット)
圧縮レベルを表します。
予約領域 (2 バイト)
予約されていますが、使われていません。 0x0000 で埋められます。
ファイルの大きさ (6 バイト)
元の (非圧縮時の) ファイルの大きさを記録しています。
Adler-32 (4 バイト)
RFC 1950 に記されている Adler-32 というアルゴリズムを用いて計算した、 非圧縮データのチェックサムの値です。
修正時刻 (4 バイト)
元のファイルの最終修正時刻です。 グリニッジ標準時の 1970 年 1 月 1 日 0 時 0 分 0 秒からの経過秒数で 表します。

zip モード圧縮レベル は、両方ともヘッダの 5 バイト目に入ります。 zip モード は、値の最も大きい部分を表すビット (most significant bit) を含み、圧縮レベル は最も小さい部分を 表すビット (least significant bit) を含んでいます。 zip モード が 1 で、圧縮レベル が 2 なら、 ヘッダの 5 バイト目は 0x12 になります。

 MSB                         LSB
+---+---+---+---+---+---+---+---+
| 0   0   0   1   0   0   1   0 | = 0x12
+---+---+---+---+---+---+---+---+
  (zip モード)  |  (圧縮レベル)

ヘッダ内での、複数バイトからなる数値はすべて、値の大きい方の部分 を表すバイト (most significant byte) が先に来た形で記録されます。