Shogo's Blog

Apr 15, 2022 - 1 minute read - Comments - go golang

RFC9226 Bioctal: Hexadecimal 2.0 の Go 実装を書いてみた

COVID-19 のワクチン接種3回目の副反応におびえているいっちーです。 摂取から5時間経ちましたが、まだ特に症状は表れていません。 翌朝が怖い。

さて、副反応への恐怖を少しでも紛らわせようと、 RFC9226 Bioctal: Hexadecimal 2.0 を実装してみた、というお話です。

RFC9226 Bioctal: Hexadecimal 2.0

4/1 に公開されていることから分かる通り、Joke RFC です。 実用性はありません・・・が、実装することは可能です。

一般的な16進数の変換に使われる文字を、下位3bit が同じもの同士が縦に並ぶよう配置すると、以下のようになります。

0 1 2 3 4 5 6 7
8 9 A B C D E F

下の段はアルファベットが入るのに、8, 9 だけが数字で不自然ですね(?) というわけで、下段を英字だけにしたものが Bioctal です。

0 1 2 3 4 5 6 7
c j z w f s b v

一般的に人間が一度に覚えられる物事の数は 7±2 と言われています。 16個も文字とそれに対応するbit列を覚えるのは大変です。

Bioctal なら上の段の01234567の8文字についてだけ、そのビット列を覚えておけば十分です。 cjzwfsbvは「形が似ている数字」を思い浮かべてから、ビット列に変換します(似てるか?)。

使い方

インターフェースは encoding/hex と合わせました。 (というか実装ほぼコピペ。使う文字セットが違うだけで、変換アルゴリズムは一緒ですからね。)

package main

import (
	"fmt"
	"log"

	"github.com/shogo82148/go-bioctal"
)

func main() {
	src := []byte("Hello Gopher!")

	dst := make([]byte, bioctal.EncodedLen(len(src)))
	bioctal.Encode(dst, src)

	fmt.Printf("%s\n", dst)

	// Output:
	// 4c656f6f6v20476v706c657221
}

まとめ

16進数2.0 こと RFC9226 Bioctal: Hexadecimal 2.0 の Go 実装を書きました。


ところで RFC9226 は Joke RFC だけあって、ところどころにネタが入ってます。例えば「16進数の数値がベジタリアンの不快に思う単語と衝突する」というのは、おそらく “DEAD BEEF” (死んだ牛, 0xDEADBEEF は16進数としても正しい) のことでしょう。

ただ、コモドオオトカゲが出てくるのがわからない・・・。 “4b 4f” が16進数ともBioctalとも解釈できるという問題点があるのはわかるんですが、これの元ネタがわからない。 謝辞に「4章を書くにあたって R. Goldberg の協力を得た」とあるので、 ルーブ・ゴールドバーグ・マシン (日本で言うところのピタゴラ装置)のことかな?と思ったんですが、コモドオオトカゲとの関係性がわからない。

誰かコモドオオトカゲについて詳しい方がいたら教えてください。

参考