(じぶんだけのキャラをつくる / はじめてのプログラミングその19)
そんなときに便利な圧縮技術。168byte、21コのキャラクターがわずかこの2行!
* 圧縮にカタカナを使ったので打ち込みはちょっと大変(-はハイフン、カタカナの長音記号は使いません)
メモリに書き込んであるデータを、効率よくプログラム形式に変換するプログラムのつくりかた。
IchigoJamのキャラクターを眺めると、アルファベットなどとカタカナだけで128文字分はありそうです。
128コのキャラクターは7bit分データを表せます。
8bit(=1byte)を表現するのに足りない1bit分を7つ集めて1つの文字とすればちょうどいい。
0-82の83文字を「,(44)」から「~(126)」、83-127を「ア(177)」から「ン(221)」にそれぞれ対応させることにしました。
デコードする時のプログラムサイズが短くなるように、いろいろと試行錯誤し、短く仕上げたものがこちら。
A=#700:N=#7A7-A+1:?"1 '";:FORJ=1TON/7+(N%7>0):[0]=0:FORI=1TO7:C=PEEK(A):A=A+1:[0]=[0]|C&128>>I:[I]=C&127:NEXT:FORI=0TO7:?CHR$([I]+44+50*([I]>82));:NEXT:NEXT:?
#700からの168byteをプログラム形式に変換するエンコーダープログラム(長さはNで調整)
逆に、メモリに書き戻すデコーダープログラムはこちら
A=#700:S=#C04:FORJ=0TO23:FORI=0TO7:C=PEEK(S):S=S+1:[I]=C-44-50*(C>176)+[0]<<I&128:NEXT:FORI=1TO7:POKEA,[I]:A=A+1:NEXT:NEXT
大きめで168byteまでのマシン語のエンコードにも使えます!
バイナリをテキスト化する方式では、たぶん最も有名なのは64種類の英数字を使ったBase64。
今回作ったものはBase64にカタカナを加えて128種類に拡張したBase128的なものと言えますね。
他にも、IchigoJam用に考案されたBase16やB15なども!
自分なりに使い勝手良いエンコード方式、考えてみるのも楽しいですよ。
links
- IchigoJamのメモリ内のバイナリデータをテキスト・プログラム化するツール ( パソコン ) - ボクにもわかる電子工作 - Yahoo!ブログ
- BASE16 : (株)田木屋商店 開発室