Heliodor 2019/07/14 22:07

ZIPファイル

プログラム話です。(また無駄に長いです)


ZIPファイル、便利ですよね。アレ。

なんでも圧縮できるし、複数のファイルを簡単にまとめられるし、手軽に使えますし。
Androidの .apk ファイルやJavaの .jar ファイル、Excelの .xlsx ファイル、Word の .docx など、実はただのZIPファイルだったりします。(これらのファイルの拡張子を .zip に変えれば普通にダブルクリックで解凍できます)


とりあえずライブラリさえあればゲームからでも割と気軽に使えるので、以前はよくゲームファイルをZIPにまとめて、場合によってはパスワードもかけてEXEと一緒に入れたりしました。
もちろんパスワードはプログラム内にそのまま文字列リテラルとして書いてあるので本気で解析されたら丸わかりなのですが、それでも割と効果的なんですよね。


ZIPを作ったり解凍したりするのにシンプルなアプリしか使っていなかったりするとなかなか気づかない事ですが、実はZIP内に入れるファイルというのはファイル毎に個別に圧縮率を設定することができます。

例えばゲームファイル全部を単一のZIPに固めるときにOGGファイルだけ無圧縮にしておくと、OGGをストリーミング再生する場合にわざわざファイルを解凍してからOGGプレイヤーに流す必要がなくなります。
Cプログラムで言えば fopen でZIPを開いて(解凍する必要はなく、本当にただ開くだけでOK)適切な場所に fseek さえしておけば、FILEをそのままOGGプレイヤーに渡すことだってできます。

また、PNGなども無圧縮で入れるには良いファイルです。
PNGというのは既に画像を圧縮してあるわけですから、それをさらにZIPで圧縮してもほとんどサイズが変わりません。
それどころかZIPからPNGへ、PNGから無圧縮画像へと二段階に解凍しなければならず無駄が多いです。

そこで圧縮済みPNGを無圧縮でZIPに入れておけば(ややこしい…)、ZIPからPNGに解凍する手間が省けます。
(逆に無圧縮PNGをZIPで圧縮しても良いわけですが)



あと、ZIPファイルのパスワードというのはファイル毎に別々にかけることができます。
例えば同じZIPファイル内にある crypt.txt と plain.txt について、crypt.txt を取り出す時はパスワードが必要だが plain.txt はパスワード不要、という事ができます。

普通にパスワード付きZIPを作るといかにもZIPファイル全体に対して1つのパスワードがかかっているように見えますが、それは単にZIP内の全ファイルに対して同じパスワードがかかっているというだけです。

あまり良い利用方法が思いつかないのですが、その気になればZIP内の全てのファイルに対してそれぞれ異なるパスワードをかけることができる、という事です。

ただしこのようなZIPを作成・解凍できるツールはそう多くはありません。
そういったZIPを扱いたければ、そこそこ高機能なアーカイバを探してくる必要があります。
(さすがと言うべきか、WinRARはこれらのZIPに対応しています)



さらにどうでもよい情報ですが、基本的にZIPのパスワードには文字数制限や文字種制限がありません。
「○○文字まで入力可能」とか「半角英数のみ」とかいうのは、あくまでもツール側が自主的にかけた制限です。

全角ひらがな漢字混じりでもOKですし、そもそも普通の文字でなくてもかまいません。タブ文字0x09とか改行文字0x0Aとか、普通にバイナリデータで 0xDEADBEEF とか。
まあ、入力できるものならやってみろという感じではありますが。

極端な話、パスワードと称して、適当なバイナリデータをぶっこんでも良いわけです。
例えばEXE自身のバイナリをパスワード(もはや文字ですらないのでパスデータと言うべきか?)
にしておいて、EXEが1バイトでも改変されていたら解凍できなくなる(=ゲームが動かなくなる)なんてこともできます。改造対策に使えそうですね。
ZIPライブラリを使って自前でZIPを作成・解凍できるならば、試してみると面白いかも……?

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索