# ebzip コマンド

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

目次:

- はじめに
- 動作とコマンド名
- `ebzip` の実行
- 圧縮
  - 圧縮の実行例 (1)
  - 圧縮の実行例 (2)
  - 圧縮レベル
  - テスト
  - 一部だけの圧縮
  - 古いファイルの上書き
  - 圧縮された書籍の圧縮
- 伸長
  - 伸長の実行例
  - 伸長のオプション
  - 圧縮された書籍の伸長
- 情報出力
  - 情報出力の実行例
  - 情報出力のオプション
- 書籍の削除
- `ebzip` のオプション一覧
- 圧縮結果の例
- 圧縮ファイルの形式
  - 圧縮ファイル形式の概要
  - データ部
  - インデックス部
  - ヘッダ部

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) です。

- 圧縮 (compression)
  一冊の CD-ROM 書籍を圧縮します。
- 伸長 (uncompression)
  `ebzip` で圧縮された、一冊の CD-ROM 書籍を伸長します。
- 情報出力 (information)
  `ebzip` で圧縮された、一冊の CD-ROM 書籍の圧縮状態に関する 情報を出力します。

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

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

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

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

>     ebunzip
>     ebzip --uncompress
>     ebzipinfo --uncompress

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

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

## `ebzip` の実行

`ebinfo`、`ebunzip`、`ebzipinfo` の 一般的な起動方法は次の通りです。

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

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

>     % ebzip
>     % ebunzip
>     % ebzipinfo

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

## 圧縮

`ebzip` (`ebunzip --compress`、 `ebzipinfo --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` が圧縮するファイルは、 `START`、`HONMON`、`HONMON2`、 `HONMONS`、`LANGUAGE` ファイルと `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` によって 作成されます。 `catalog` と `catalogs` は、出力側のディレクトリ にコピーされます。 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` だということが分かります。

`english` と `german` だけを圧縮するには、次の ようにします。

>     % ebzip --subbook english,french /dict

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

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

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

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

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

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

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

- `font`
  外字のフォント
- `graphic`
  画像データ
- `sound`
  音声データ
- `movie`
  動画データ

### 古いファイルの上書き

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

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

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

`y` か `n` で答えて下さい。 `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 --uncompress`、 `ebzipinfo --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` が付加されます (例: `honmon2` → `honmon2.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 整数`
  圧縮レベルを指定します。 整数 は、`0`、`1`、`2`、 `3`、`4`、`5` のいずれかでなくては いけません。 レベル 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` が扱っている圧縮ファイル形式の詳細について説 明します。

### 圧縮ファイル形式の概要

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

- CPU の種類、オペレーティングシステム、ファイルシステムに依存しません。
- 非損失圧縮です。
  圧縮ファイルを伸長することによって、元のファイルを復元できます。
- 6 つの圧縮レベルがあります。
  伸長の速さか圧縮率の良さの、いずれかを選ぶことができます。

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

>     +--------+-------------+-----------------------------+
>     | ヘッダ |インデックス |          データ             |
>     +--------+-------------+-----------------------------+
>                                                          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) が先に来た形で記録されます。