/******************************************************************************* ese-pack ver.0.01 2005/10/26 Mizki_F *******************************************************************************/ ハフマン法符号化モジュール「mod_huffman.hsp」及び、LZ法(スライド辞書法)符号化 モジュール「mod_lz_slide.hsp」のデモ用アプリです。 これらのモジュールは全てHSPの標準機能のみで作成されています。 プラグインやDLLを必要としないので、解凍ソフトやライブラリなどをインストールして いないPCでも圧縮ファイルを扱うことが可能になります。 ○ese-packについて ファイルをLZ法→ハフマン法で圧縮します。 まだ開発途中なので書庫を作成することはできません(フォーマットはできているので、 ちょっと改良すれば可能になるんですが)。 「Encode」ボタンを押しファイルを選択すると圧縮を開始します。 圧縮が完了するとファイル保存ダイアログが開くのでファイル名を指定して保存します。 拡張子は「.esz」です。 「Decode」ボタンを押しeszファイルを選択するとカレントディレクトリに元のファイル 名で解凍します。 解凍したファイルは更新日時が元のファイルと同じになります。 単純にLZ圧縮をしたものをハフマン圧縮しているだけなので、圧縮率はLHAやZIPほどには なりません。 ファイルにも因りますが4割〜6割程度のサイズになります。 あまりにも小さいサイズのファイルは逆に増大する可能性もあります。 また、モジュール自体も開発中なので圧縮に結構な時間がかかります(HSPだとあまり速 くならないのかも知れませんが…)。 ○eszファイルについて eszファイルの中身は「ヘッダー+圧縮データ」という形になっています。 ヘッダーはLHAのレベル2ヘッダーとほぼ同じフォーマットです。 ヘッダー情報フォーマットは以下のとおり。 Offset Size 種類 概要 -------------------------------------------------------------- 0-1 2 数値 ヘッダーサイズ 2-6 5 文字 識別文字列 "-esz-" 7-10 4 数値 圧縮サイズ 11-14 4 数値 ファイルサイズ 15-18 4 数値 更新日時(time_t) 19 1 数値 予約領域(0x20固定) 20 1 数値 ヘッダーレベル(0x02) 21-22 2 数値 CRC値 23 1 文字 OS識別子('M') 24-25 2 数値 拡張ヘッダーサイズ 26 1 数値 拡張ヘッダー識別子(0x01 ファイル名) 27- N 文字 ファイル名 (単位:バイト) 拡張ヘッダー識別子0x02 ディレクトリ名を利用することで書庫にも対応できます。 ○ソースコードについて ese-packは以下のコードから成り立ってます。 (モジュールについては個別にテキストを用意するつもりでしたが、時間が足りなかった  ので概要だけ記しておきます。) ・ese-pack.hsp ese-packの基本部分です。 ヘッダー生成ルーチンもこちらに入っていますが、後でモジュールとして分離 する予定です。 ・mod_bitio.hsp バッファの入出力に関するモジュールです。 ハフマン符号化に用いるビット入出力ルーチンなどが用意されています。 ・mod_huffman.hsp ハフマン法符号化に関するモジュールです。 奥村 晴彦 氏著「C言語による最新アルゴリズム事典」のサンプルコード "huffman.c"をHSPに移植したものです("bitio.c"についても同様)。 ・mod_lz_slide.hsp LZ法(スライド辞書法)符号化に関するモジュールです。 奥村 晴彦 氏著「C言語による最新アルゴリズム事典」のサンプルコード "slide.c"をHSPに移植したものです。 ・mod_crc.hsp 16ビットCRC生成に関するモジュールです。 CRCテーブルはリテラルとして用意する方法ではなく、起動する度に算出させて います(あまりメリットはありませんが…)。 ・mod_timestamp.hsp ファイルのタイムスタンプに関するモジュールです。 LHAのレベル2ヘッダーなどに使われているtime_t形式は、ANSI Cなどでは標準 ライブラリで簡単に使えますが、丁度良いAPIなどが見つからなかったので無理 矢理計算させています。 (WindowsAPIで使われているFILETIME構造体は64bit値ですが、time_t型は32bit  値です。なんとか直接変換しようと思ったのですが、HSPでは64bit演算ができ  ないので挫折しています…。) ○今後の予定 とりあえず複数のファイルを纏める(アーカイブ)に対応させる予定ですが、最終目的は HSP標準機能のみでLHA・ZIPを扱えるようにすることです。 とはいえ、まだまだ勉強中なので完成までにはかなり時間がかかりそうですが… ○参考文献 ・「C言語による最新アルゴリズム事典」 奥村 晴彦 (著) 技術評論社 参考URL:http://oku.edu.mie-u.ac.jp/~okumura/algo/ …ハフマン法やLZ法以外にも色々なアルゴリズムの説明やサンプルが載って  います。 ・「LHAとZIP 圧縮アルゴリズム×プログラミング入門」 奥村 晴彦 / 山崎 敏 (著) ソフトバンクパブリッシング 参考URL:http://www.01-tec.com/book/lha_zip/ …LHAやZIPのアルゴリズムや生い立ちから実際のプログラミングまで、かなり  詳細に書かれています。 ○言い訳 元々HSP2.60の時に着メロ圧縮ツールを作ったのがきっかけでした。 (auやVodafoneに採用されている着メロのフォーマットSMAFはハフマン法で圧縮すること ができます。16ビットCRCモジュールもこのときに作ったものです。) HSP3.0になって再帰的アルゴリズムが使えるようになったので書き直したのですが、この とき気の迷いでLZ法も作ってみようと思ってしまいました。 その結果を組み合わせたものがese-packです。 仕事の合間に作っていたのでまだ素組みの状態ですが… これからじっくりパテ盛り・整形・塗装していくつもりです。 ちなみに私はモデラーでもモデルでもありません。 (ここ笑うところですよ!) 以上。