COVID-19 のワクチン接種3回目の副反応におびえているいっちーです。 摂取から5時間経ちましたが、まだ特に症状は表れていません。 翌朝が怖い。
さて、副反応への恐怖を少しでも紛らわせようと、 RFC9226 Bioctal: Hexadecimal 2.0 を実装してみた、というお話です。
RFC9226 Bioctal: Hexadecimal 2.0
4/1 に公開されていることから分かる通り、Joke RFC です。 実用性はありません・・・が、実装することは可能です。
今年のジョークRFC「16進数2.0」。16進数を表記するには0から9の数字にABCDEFを加えた物が一般的だが、01234567cjzwfsbvにする事で、数字かどうかで最上位bitがすぐ分かり、なんとなく形が似た文字から下3bitがすぐに連想できる為humanのbrain cyclesを抑えられるという内容https://t.co/BsmKFcqv4J
— Fadis (@fadis_) April 2, 2022
一般的な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 の協力を得た」とあるので、 ルーブ・ゴールドバーグ・マシン (日本で言うところのピタゴラ装置)のことかな?と思ったんですが、コモドオオトカゲとの関係性がわからない。
誰かコモドオオトカゲについて詳しい方がいたら教えてください。