bim2bin
概要
- バイナリ圧縮ツール。
- もともとはOSASK実行アプリケーションのサイズを縮めるために作られた。
- 現在は一般のファイルを圧縮することも可能。
ダウンロード
ドキュメント
ライセンスについて
このパッケージにあるものはt5lzmaを除いて、すべてKL-01です。
t5lzmaのソースは、tk5lgpl1にあります。
dtk5s0cは一から僕が書いたので、完全にKL-01になりました。
t5lzma_p.txtについては、これをLZMA-SDKに対するパッチだと誤解する非常に迷惑な問
い合わせがあったのでバンドルをやめました(もともとライセンス防衛のためのもので
ありそれ以外の用途のものではないので)。
---
bim2bin4は、tek5を生成するときに限って、t5lzmaが必要です。bim2bin.exeと同じ場
所にt5lzma.exeをおいておいてください。tek5を生成しないのなら、t5lzmaは不要です
。展開だけならt5lzmaはいりません。
bim2bin4は、基本的にOSASK ver.4.7と組み合わせて利用することを前提にしており、
デフォルトで生成したアプリケーションやデフォルトで圧縮したデータは、OSASK ver.
4.5以前では利用できません。OSASK ver.4.5以前でも利用したい場合は、-tek0 rjc:0
の2つのオプションを追加してください。tek5のときにeprm:z0を指定すれば、stk5モー
ドになってOSASK ver.4.6でも使えます。
bim2bin4からrjcオプション(相対ジャンプコンバータオプション)がデフォルトで有効
になるため、OSASKアプリに限り、同じ圧縮形式であっても以前よりコンパクトになる傾
向があります。これをオフにしたい場合、圧縮時にrjc:0を指定してください。
その他、デフォルト値がいくつか変更されています。BS:のデフォルトは0になりました
。MD:のデフォルトはtek1~tek5のときはMD:0になりました。clv:のデフォルトは4にあ
がりました。
OSASKアプリを生成する場合(bimからorgを作るときの話)、-tek5を選ぶためには、
obj2bimでスタックを大きめにとってある必要があります。-tek0~-tek2までなら、今ま
でどおり最低4kでかまいません。-tek5を選ぶ場合、20kを最低と考えてください。
-osacmpのときは(orgからbinを作る場合)、-tek5を選んでもスタックを直さなければ
いけないということはありません。
bim2bin4の-restoreはまったくチューンされていない展開ルーチンを使っているので、
展開は遅いです。添付のtstdstk等を使うほうがずっと高速です。bim2bin4のrestore機
能はおまけだと思ってください。
---
簡単な使い方:
[圧縮]
prompt>bim2bin -osacmp -tek1 in:data.bin out:data.tk
prompt>bim2bin -osacmp -tek2 in:data.bin out:data.tk
prompt>bim2bin -osacmp -tek5 in:data.bin out:data.tk
tek1とtek2では、いずれもデフォルトではstk互換形式になります。tek5ではデフォルト
は、stk非互換形式です。8MBを超えるファイルはin:に指定しないでください。
[展開]
prompt>bim2bin -restore in:data.tk out:data.bin
[アプリ生成]
prompt>bim2bin in:helloc4.bim out:helloc4.org malloc:1k mmarea:0 -tek1
prompt>bim2bin in:helloc4.bim out:helloc4.org malloc:1k mmarea:0 -tek5
[-tek5で使える追加オプション]
eprm:z0 -- stk5互換モード(圧縮・展開が速いが圧縮率は良くない)
eprm:z1 -- tek5コンパクトモード(小規模・中規模のものはこれが一番効く)
eprm:z2 -- tek5ノーマルモード。デフォルト。
eprm:@ -- tek5オートモード。z0~z2のどれにするかを解析して自動決定する。
しかしそれ相応の時間が掛かるので、気軽には使えない。
512/1024コンテストなどのときには重宝する。
---
推奨:
OSASKでは書き換えアクセスをしないファイルについては、圧縮しておくことが推奨され
ます。もちろん、-osacmpしたら結果的に大きくなってしまうとか、せいぜい1割しか小
さくならないというような場合は、圧縮しておかなくてもいいと思います。
圧縮するとなると、どの形式を使うかで迷うと思います。そんなときは、まず、tek5で
圧縮してみましょう。そして圧縮の結果が100KBを超えるようなら、tek2にすることも検
討しましょう。
これはtek5の展開に少々時間がかかるためで(といってもtek0程度ですが)、小さなフ
ァイルでは展開時間が気になることはまずないですが、大きなファイルでは気になる人
がいるかもしれないからです。・・・でも、大きなファイルこそ高圧縮にしたい場合も
ありますので、そういう時はtek5でいいでしょう。また、100KBというのは一つの目安で
あって、人によって20KBだったり500KBだったりしていいと思います。
---
おまけ:
最後まで読んでくれたあなたに、512バイトキャンペーン・1024バイトキャンペーン時に
有利になるテクニックを教えてあげます。他の人には内緒ですよ、なんていうせこいこ
とは言いませんので、知らない人がいたら教えてあげてください。
1.
ASKAやNASMで作ったOSASKアプリをosacmpするときには、rjc:0のほうが圧縮率がいい場
合があります。やり比べてみるといいでしょう。
2.
これは-tek5限定ですが、OSASKアプリをosacmpするときに(orgからbinを作るときに)
、eopt:-lc2にすると圧縮率が良くなる場合があります。ただしこれをやるときは、
スタックを増やす必要が出てくるかもしれません。-lcについては0-8の範囲でいじれま
す。・・・ちなみにosaskgoのような大きなアプリでは-lc8にするともっと圧縮率が良
くなります。また、lcを大きくすると展開速度が落ちてくるということにも注意が必要
です(-lcのデフォルトは0です)。
lc0 lc1 lc2 lc3 lc4 lc5 lc6 lc7 lc8
20k 22k 28k 40k 64k 112k 208k 400k 784k
(補足)
pbというパラメータは、圧縮対象にどんな周期性がありそうかを教えるものです。pb0
は1バイト単位の周期(つまり周期なし)、pb1は2バイト単位の周期、pb2は4バイト単
位の周期を意味します。デフォルトはpb0です。バイナリデータなどは周期性が期待で
きるのでpbはその周期にあっているほうがいいですが、実行コードやテキストデータ
なら周期性はまずないのでpb0のほうが高圧縮になるでしょう。pbは最高で4まで(つ
まり16バイト周期まで)指定できます。
(補足)
lcというパラメータは、圧縮対象のバイト間の相関の程度を表します。0x00のあとに
は0x01がくることが多い、といったような、直前のバイトから次のバイトの予測がど
のくらい可能なのかの指標です。lc0ではバイト間の相関は全く無いと想定します。
lc1では直前のバイトの上位1ビットを参考に、次のバイトを予測します。lc2では直前
のバイトの上位2bitを参考にします。lc8では直前のバイトの8bit全てを予測に使いま
す。相関がありそうなファイルであっても、小さなファイルでは十分な統計を取れな
いので、そういう場合はlcを大きくしてもいい効果は得られません。
3.
これもtek5限定テクニックですが、OSASKアプリに限らずいろいろ使えます(いやまあ、
前述のlcはテキストファイルにも効果てきめんではありますが)。
eopt:-fb128というオプションがデフォルトになっているのですが、この数字を32-255の
範囲でいじることで圧縮率が良くなる場合があります。小さいファイルではfbを変えて
もほとんど効果はありません。lc2などといっしょに指定する場合は、
eopt:-lc2_-fb120などと、アンダースコアでつないでください。
(この項追記)
eoptを改良するとeprm以上に効果がある場合が多いのですが、最適なパラメータを人力
で探すのは非常に大変です。そこで、これを自動でやらせるオプションを作りました。
ただしこの機能を使うと圧縮時間が500倍くらいかかります。だから基本的にはおすす
めしません。eopt:@とすると自動でやります。なお、eopt:@@とするとどんなパラメー
タをテストしているのか、途中経過がわかります(時間は変わりません)。
4.
これもtek5限定テクニックです。しかもeprm:z2のときしか使えません。
eprmには、d~hのオプションがあります。dオプションは0-3、その他は0-1の範囲で指定
できます。指定するときは、z2の後ろに連ねます。デフォルトは、eprm:z2d0e0f0g0h0で
す。デフォルトのままでいいオプションは指定しなくてもいいです。
たとえば、osaskbmpは、erpm:z2d3h1が一番小さくなります。
d:出現文字の統計アルゴリズム番号
e:LZが効きにくい部分がたくさんあるときに1にすると有効
f:LZの距離情報の統計アルゴリズム番号
g:LZで遠距離と近距離とでアルゴリズムを変えるかどうか
h:LZの一致長2-9と10-17とでアルゴリズムを変えるかどうか
こんなの説明されてもわからないので、適当にいじってみるしかありません。