福野泰介の一日一創 - create every day

7bit x 8 = 7byte、IchigoJam用バイナリデータ圧縮法 Base128実装例

2018/04/11
#IchigoJam 

IchigoJamでつくるオリジナルキャラクター、たくさん作るとプログラムが溢れてしまいます。
じぶんだけのキャラをつくる / はじめてのプログラミングその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用に考案されたBase16B15なども!
自分なりに使い勝手良いエンコード方式、考えてみるのも楽しいですよ。

links
- IchigoJamのメモリ内のバイナリデータをテキスト・プログラム化するツール ( パソコン ) - ボクにもわかる電子工作 - Yahoo!ブログ
- BASE16 : (株)田木屋商店 開発室

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像