base47

Base64 が 64 文字を使うところを、47 の都道府県を数字として使う符号化。
北海道が 0、沖縄県が 46。あとは 47 進数を書き下すだけ。

9 バイト = 13 都道府県 1都道府県あたり 5.5385 bit(理論上限の 99.7%) 区切り文字 不要 パディング 不要

入力(文字列)0 バイト

出力(都道府県)0 都道府県

なぜ区切り文字が要らないのか

47 都道府県には、どの名前も他の名前の先頭になっていないという性質があります (3文字名と4文字名しか無く、「神奈川」「和歌山」「鹿児島」はどれも県名ではない)。 つまり並びは前から順に一意に読み切れる ── 情報理論でいう接頭符号です。 Base64 が末尾に = を必要とするのに対し、base47 はパディングも区切りも要りません。

桁の詰め方

9 バイト(72 bit)をひとかたまりにして、47 進数 13 桁に書き直します。 4713 はちょうど 2569 をわずかに上回るので、無駄が最も少なくなります。 端数は下の表のとおりで、長さ自体が端数の情報を持つためパディングは不要です。

47の桁

使い方

import { encode, decode, decodeText } from "base47";

encode("さくら");        // "香川県山形県奈良県長野県東京都…"
decodeText("香川県山形県奈良県長野県東京都…");  // "さくら"
encode(pngBytes, { separator: "・" });
$ base47 encode "さくら"
$ base47 decode 香川県山形県奈良県長野県東京都…
$ base47 encode -f photo.png --sep ' ' > photo.txt