[前へ] [目次]


ebzip のオプション一覧

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

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

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

インデックス内での、複数バイトからなる数値はすべて、値の大きい方の部分 を表すバイト (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 ビット)
圧縮モードを表します。 本バージョンの EB ライブラリでは、1 (2 進数で 0001) だけが規定されて います。
圧縮レベル (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) が先に来た形で記録されます。


[前へ] [目次]