Ans符号化法を利用してファイル圧縮プログラムを作ろうとして苦労した話

苦労した話と言っていますがいまだに苦労している最中なので、圧縮プログラムの完成まではあと少し時間がかかりそうです。
ではこれから、Ans符号化法を利用してファイル圧縮プログラムを作ろうとして苦労している話をしようと思います。
ファイル等は全て01のデータで保存されているので、それをans符号化法を利用してもっと短い文字列に直します。

それらが一意復号可能ならば、それは圧縮できたと言えます。

しかし、PC上ではそれらは基本的に1バイトづつ処理されるのでバイナリーデータを処理するのは少し骨が折れます。また、0と1が永遠と並んでいるのは僕たち人間も醜いので、それらを4ビットづつ16進数に直していきます。

つまり、以下のように2つの文字を1バイトとして読んでいくことにしました。

01 22 92 12 A3 F1

なのでこれら16種類の文字をansで符号化していこうと思います。

しかし、そこで問題なのが、これらの文字を4ビットづつ処理し圧縮した場合、出力される文字数も4ビットの倍数になることです。そうすると出力される文字数が1バイトに満たなくなるので、PC上でデータを扱うのに適さなくなります。

そこで、0埋めをしようと思ったのですが、圧縮後の文字数がいくつになるのかわからないので、0埋めをする必要があるときとない時があります。つまりその情報を圧縮後のデータに加えなければいけなくなり、処理がめんどくさくなります。

具体的には最初に読み込む最初の数バイトに全体の文字数を記録して、復号する前に文字数を把握してその文字数になったら復号を止めるという方法です。

それよりも1バイトで一つのデータとして見た方が圧縮しやすいのでは?

と思いついたのですが、

16種類×16種類あるので、256種類もの文字をans符号化することになり圧縮率が下がってしまうのではないか?と考えました。また、僕はいつも符号化する際に2桁以下の文字の種類から符号化していたので、このような256種類の記号数から符号化するのができるのかどうかがわからないことから嫌煙していました。

しかし、この方法だと、0埋めの必要などの助長なデータもなくなるため、この方法でやってみたいと思います。(これからやります)

実験結果はあとでこのブログに載せようと思います。