この文書は 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
で圧縮された、一冊の CD-ROM 書籍を伸長します。
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 書籍の圧縮を行います。
この節では、ハードディスクにすでにコピーしてある 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
ディレクトリにある外字ファイルです。
この節ではもう一つ別の例として、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
-h
--help
-i
--information
-k
--keep
-l 整数
--level 整数
-n
--no-overwrite
-o ディレクトリ
--output-directory ディレクトリ
-q
--quiet
--silence
ebzip
はその出力側のファイルを上書きして良いかどうか
訊いてきます。
この質問を抑制するには、--force-overwrite(-f)
または --no-overwrite(-n) を指定して下さい。
このオプションは、情報出力の動作のときは、無視されます
-s 型
--skip-content 型
ebzip
が現在のところ認識するデータ型の名前は、
font
(外字のフォント)、graphic
(画像データ)、
sound
(音声データ)、movie
(動画データ) です。
指定しなかったときは、どのファイルも無視されません。
-S 副本
--subbook 副本
-t
--test
-u
--uncompress
-v
--version
-z
--compress
次の表は、ある英和・和英辞典 (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 バイト)
zip モード (MSB 側の 4 ビット)
ファイルの大きさで値が変わるのは、歴史的な事情によります。 以前の EB Library は圧縮モード 1 しか既定しておらず、また 4GB バイト を超えるファイルを扱えませんでした。 4G バイトを超えるファイルを扱えるように EB Library を改良した際に、 「4G バイトを超えたら、圧縮モードは 2 にセットする」というルールを 新たに設けました。 これにより、以前の EB Library で 4GB バイトを超えたファイルを扱おう とすると、非対応の圧縮モードとみなされ、エラーが発生するようになって います。
圧縮レベル (LSB 側の 4 ビット)
予約領域 (2 バイト)
ファイルの大きさ (6 バイト)
Adler-32 (4 バイト)
修正時刻 (4 バイト)
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) が先に来た形で記録されます。