rgbaデータでよく使われる16進数を、64進数に変換(逆変換)するプログラムです。 端を押すたびに、入力データがランダムに一つの値を取ります。 [概要] random data:入力データです。 output:変換後のデータです。 correct?:変換が可逆かどうか確かめます。絶対にtrueでなければいけません。(検証はしましたが、念の為falseになったら、その時のrandom dataの値と一緒にその旨をコメントしていただきたいです。) effective?:変換後の方がデータ量が少ないことを確かめます。こちらは偶にfalseを取ります。その理由は以下に示します。 [変換] 仕組みは、16進数を2進数に変換したあとに再度64進数に変換し直すものです。 まず、16進数を1桁ずつ2進数に直します。 例:a6→10100110→??? 16進数は1桁当り4bit、64進数は6bitなので、bit数が6の倍数になるようにします。ここでは末尾に0を幾つか追加します。 例:a6→10100110→101001100000→??? 6桁ずつ64進数に変換します。 例:a6→10100110→101001100000→&w→??? 末尾に、先程追加した0のbitの数を付与します。 例:a6→10100110→101001100000→&w→&w4 [逆変換] 64進数→2進数→16進数変換です。まず、末尾の追加bitの情報を切り離します。 例:|=4→|=→??? 1桁ずつ2進数に変換します。 例:|=4→|=→110010110000→??? 切り離した追加bitの情報から、末尾を切り取ります。これで元の2進数変換が得られます。 例:|=4→|=→110010110000→11001011→??? 4桁ずつ16進数に変換します。 例:|=4→|=→110010110000→11001011→cb [圧縮効率] 16進数も64進数も、使われる文字は全て1Byte(8bit)です。(気休め程度の情報かもしれませんが、データ量は完全に文字数に依存します。) このとき、先程も言及した通り、16進数は1桁当り4bit、64進数は6bitなので、単純計算で変換前の文字列長nに対して変換後の文字列長はceil(2n/3)+1となります。(ceilは切上。) この値は、n>3でn>ceil(2n/3)+1、n<=3でn<=ceil(2n/3)+1であるため、3文字以下の入力に対してはデータ量に変化はないか、かえって増えてしまいます。しかし4文字以上の入力には効果を持ち、文字列長を大きくしていくにつれて圧縮率は66.7%に漸近します。(これを下回ることはないです。) [その他メモ] 16進数の変換先として64進数を選んだのはそれなりに都合が良いからです。まず、どちらも2^n進数(n∈ℕ)なので、経由点が分かりやすいです。また、変換のために増やさなければいけないbitの数も、共通な因数を持つ数の進数変換なのでそこそこ低コストに抑えられます。先程に述べた、1Byte文字は英語の半角文字くらいしかないので(偉大なる先人の方々は93進数までを考え出しておりますが)、最大限の文字種を考え64進数としました。