※以下の記事の続きというか補足のようなもの。

十進法、二進法について了解していただいたわけであるが、十六進法というものもありがち。それについて。

※あと、「二進法のはなし」の内容で誤解を生むような説明があったからちょっと修正した。どことは言わんが。(2020/2/12)

◆十六進法

基数が16ってだけっすよ。

使用される文字は以下の通り

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

「10」から「15」を一文字で表すためにAからFまでのアルファベットが使用される。

なんのために十六進法が存在すんじゃいってのは、二進数だと余りにも読みづらいから。

‭1100 1001 0101 1111 1000 0010 0111 1100 1001 1010 1111 0000‬

これが

‭C95F 827C 9AF0‬

こうできるんですね。キャホウ。

※空白は読みやすさのため

▼変換方法

二進法から十六進法は簡単。「1011010」を変換してみよっか。

1011010

まず、4個ずつで区切る。

101 1010

その4つのビットのまとまりを十進法に変換する。

5 10

これを十六進法に変換する。

5 A

合体!

5A

これで終わり。

何でそんなことが出来るのかって、そりゃ十六進法の繰り上がりの周期に二進法の繰り上がり周期が被るからです。

16は2の4乗だからです。わかれ。この説明でわかれ。最初に二進数を4個ずつで区切ったのは、16が2の4乗だから。

▼十六進法から十進法

「5A」は「(16の1乗 × 5) + 10」だから、90になる。

「B5A」は「(16の2乗 × 11) + (16の1乗 × 5) + 10」だから、2906になります。

考えろ。わかれ。

▼用途

色々あるんだけども、例えば色コードというものがある。

原色大辞典

上のページの色見本に「#ff6347」とか書かれてると思うんだけど、それが十六進数値。二桁ずつが「R」「G」「B」に割り当たっている。

 tomato  は「Red」が「ff」。「Green」が「63」。「Blue」が「47」。

47ってのも「(16の1乗 × 4) + 7」だから、十進法では 71 ですね。「ff」は 255。

このブログのタイトルは「10bace LOG」なんだけど、その 10bace も色コード。

#10bace

だれも名前つけてないから10bace色としか言えない。

んで最近はHSLとかアルファ値含んだHSLAっつー表現がブラウザ上で(略

あとRYB派もいたりしてね。

話が逸れたね。

◆32進法、64進法

十六進法があるのであれば、32進法とか64進法も使われていそうなものである。無論、使われてなくもない。でもあんまり見ないね。たぶん、文字種が多すぎて人間が読めない感じになっちゃうからだろう。

三十二進法 | Wikipedia

◆base32

32進法はさほど使われてないけど、base32というエンコード(符号化。データ変換方式。)は良く使用されている。

「base」すなわち「基」が32あるエンコードだ。

RFC4648っていう取り決めが存在している。

「A~Z」の26文字と、「2~7」の6文字、あと「=」が使用される。

33文字あんじゃ~んwウケる~wマジ卍~w

ゼロとイチが含まれないのは「IとかOと見間違っちゃわね?」という意味の解らん理由。なんでそんなことになったんだろう。なぜ人間が読んで処理することを想定した?本当に分からん。どういう経緯があったんだ。

▼なぜbase32が必要なのか

用途は様々。過去の用例でいえば、マルチバイト文字っていう種類の文字表現を伝達するために使用されていたことがある。今お前が読んでいる文字はマルチバイト文字列です。😎

マルチバイト文字ってのは中々に闇の深い野郎で、更に言えば「どんなシステムでも扱える」という代物ではない。だから、その文字のエンコードを一旦ゼロとイチにまで分解(デコード)してしまってから、ASCIIという、大抵のシステムで扱える文字コードに変換してから伝達してみたくなった。

更に言えば、ASCIIの中でも制御文字とか含まれちゃうから、それを除去したかった。

それがbase32です。

変換方法とか手順踏めば簡単だし教えてもいいけど、どうせライブラリ使えば良いだけだから教えない。

ただ、base32は、32進法ではないということだけ注意。

◆base64

base32よりも圧縮率を高めたくなってbase64も開発された。base32だと「5ビットの情報量」を一文字にできるけど、base64なら「6ビット」までを一文字にできる。

base64は「データURL」という表現にも使用される。

スーパー雑に説明するんだけど、例えば画像ってものがあるじゃないですか。「.jpg」とかついてるやつ。それは「バイナリデータ」という、ゼロとイチで構成されているデータなんです。人間が読むことを想定しないデータ。「.txt」とかのテキストデータは人間に読みやすいようにゼロとイチ以外の文字も表現できるようにルールが整備されている。

そのバイナリデータっていうものは、テキストに埋め込むことが極めて難しい。無理やり埋め込んでもいいんだけど、「01010101…」ってな感じに文字数が膨大になる。だから、それを文字数少なく埋め込むためにbase64変換が使用される。

えぇと。バイナリデータにおける「0」と「1」は、そのまま1ビットの情報量しか持たない。でも、テキストデータにおける「文字」である「0」と「1」はなんと1オクテット、すなわち1バイト、すなわち8ビット、すなわち8倍の情報量になっちゃうんですね。かさむ。そのかわりゼロとイチ以外の、例えば「2」とか「A」っていう文字も1バイト使って同じように表現できる。

※ASCII文字コードの本当の所では1文字が7ビットだし、あと(略

HTML、つまり今お前らが見ているこのページは、テキストで書かれている。バイナリで書くヤツはいない。そのHTMLというテキストの中に無理やりバイナリデータを埋め込みたくなったらbase64変換してデータURLとして参照すればいいんです。詳しくは説明しないけどそんな感じ。

※最近だとWasmでバイナリのまま色々な表現が出来たりもする。

▼用途

データをハッシュ化すると、ハッシュ関数によってはバイナリ値になっちゃったりして、バイナリをやりとりするのがダルいからbase32とかbase64でエンコードしたりする。

みんな大好きで脆弱なBasic認証とかもユーザー名とパスワードをbase64でエンコードしてヘッダーに詰め詰めして送ってやらねばならん。なぜなら、パスワードに色々な文字列を設定できるようにしたいから。でも通信するときに入っちゃまずい文字列が紛れると困るから。

◆結論

以上。我ながら雑な説明だったな。でもまぁ後は自分でなんとかしろ。帰れ。