見出し画像

バイナリファイルの圧縮に失敗した話

モールス符号で符号化するという試み

無線通信分野、とくにアマチュア無線の愛好家たちの間でモールス信号で通信を行う人たちがいます。

このモールス符号、単純ではあるが、よく考えて作られた符号化の方式であり、小さくて1ビット、大きくて4ビットまでのバイナリで表現されます。
私はこのモールス符号に魅せられて、コンピュータで扱うファイルをモールスに置き換えることができないだろうかと考えました。理屈的には全く不可能ではない仕組み故、符号化することはできました。
しかしながら、ASCIIコードで扱うアルファベットのサイズは1バイト。つまり、変換後のファイルは元のファイルサイズの8倍になってしまいます。必ず8倍になってしまいます。

もしかしたら、圧縮できるかもしれないと考えたのは、ハフマン圧縮という理論を学んだことにありました。正確ではありませんが、ハフマン符号は頻出頻度をもとにバイナリ符号の長短の優先順位を決定し、頻度の高いものを短い符号、頻度の低いものを長い符号を割り当てます。
私は、この可変的に割り当てを変えるという発想にヒントを得て、モールス符号の4バイトに1バイトの符号を割り当てるなどの工夫を組み込めば、ファイルの圧縮が可能であるのではないだろうかと考えました。
ここまではよかったのです。

どこがダメだったのか

実際にどこが悪かったのかというと、情報の圧縮には、基本的に可逆圧縮である必要性があります。画像など、人間の目で見て不必要な情報を破棄することによって、必ずしも可逆圧縮ではならないわけではないものもあり、絶対に復元可能性を担保するものだけが圧縮技術であるとは言い切れませんが、文字情報など、欠落してはならないコンテンツもあることは事実で、可逆圧縮することが前提となります。
順を追って説明します。

圧縮のプロセス

①圧縮するときには、バイナリの長さを長いものとしてアルファベットの1文字に圧縮しなければならないので、4バイトないし、3バイトを一つのアルファベットに集約します。
②変換したアルファベットを、高頻度の4バイトのアルファベットを1バイトでアサインされている符号EやTに置き換えていきます。
③置き換えたアルファベットのモールス符号をもとに、再度、バイナリファイルに変換し、圧縮を完了させます。

ここでは、約40パーセントぐらい情報量を削減することができ、可逆圧縮に成功したかのように思われました。

解凍のプロセス

①解凍するときには、再割り当てされたアルファベットを復元するために、バイナリから符号化をしなければならなりませんが、圧縮した時とは勝手が違って、4ビットあるいは、3ビット、2ビット、1ビットと合致する符号がなければ、1ビットずつ減らして合致を求める探索方式ではなく、あくまで、暗号化された状態のバイナリをアルファベットに復元しなくてはならなりません。ランダムにアサインされたアルファベットで暗号化されたバイナリファイルを復元することは不可能であります。
不可能であると書いたのは、何パターンか存在することについて一意に決めてかかることができないという意味であり、絶対に無理ではありません。しかし、何億パターン以上ファイルサイズによってはそれ以上にもなる可能性があり、現実的ではありません。


圧縮の手順
解凍の手順

秘匿化するというところまでは利用できる

しかしながら、再度バイナリファイルに戻すことは、現実的な利用法として困難があったとしても、素のバイナリファイルを所謂Base64などと同じ発想でエンコードし、分割保管するなどの分野で利用する価値はあるのではないだろうかと考えられます。

ソースコードの準備が整い次第、GitHubにて公開いたします。



この記事が気に入ったらサポートをしてみませんか?