暇つぶしに36進数を弄ってみる
通常、進数は2、8、10、16が一般的だけど、ちゃんと法則さえ守ればもちろん文字数は増やせる(ただし、あくまで文字列上だけであって、データとして扱うなら2、8、10、16の方が都合が良いという事だけ先に宣言しておく)
※内容がしょーもないのでほぼ全文折りたたんでおきます。興味がある人だけどうぞ※
- 2進数の場合
とりあえず、通信では一般的な2進数について。
2進数は"2"になったら桁が上がる進数のこと。(当たり前の話)
つまり、表記上には0と1しか存在しない。 - 8進数の場合
こっちはビットとバイトの関係
2進数と同様、”8”になったら桁が上がる
つまり、0-7までは表記に出てくる - 10進数の場合
日常生活でも一番お世話になる進数
こっちは”10”になったら桁が上がる
0-9が存在する - 16進数の場合
こっちはHTMLとか弄ってる人だと結構見かける。日常生活じゃあまり見ない
こっちは特殊で、”16”ではなく”G”になったら桁が上がる
要するに、0-9、A-Fが存在する(”10”だと桁が上がっているため)
まぁ、36進数だと0-9の10段階とA-Yの25段階の合計”35”段階ある
多分気が付いてると思うけど、進数にくっついている数字は、”桁上がりする数字”が書かれている。
例えば2進数だと”2”で桁上がり、10進数だと”10”で桁上がり(16進数は10進数との矛盾…というか誤認を防ぐため?にA-Fが使われている)
36進数だと、36文字目のZが桁上がりの数字になる(一応、37進数も可能といえば可能。Zまで行って、一周したら桁上がり、と言った感じ。ごっちゃになるから使いたくないけど)
何で36進数なのか、というのは、分かりやすく言うと"進数の仕組みをうまく使えば暗号文組めるんじゃないか?"という発想。
(あと、ここでこんなこと書いてるのは、わざわざこんな説明が面倒な自己満内容を動画にするのが面倒なだけです)
前置きを長ったらしくやっても仕方ないし、ササッと説明してみる。
流れとしては、
1.Zを除く平文(濁音で使うからかなりきついけど)を用意する
※平文:暗号化する前の文章
2.36進数を2進数に変換する
3.ビット反転する
4.10進数にデコードする
出来上がり
例えば、自分のHNの”MIYA”を試しにやってみる
M→13文字目。つまり、22
I→9文字目。つまり、18
Y→25文字目。つまり35
A→1文字目。つまり10
あとは16進数と同じように2進数に直す。
ここで問題となるのが、36が2進数のn倍じゃないってこと
32だったら変換後のビット数に困らないが、こっちは困ることになる
仕方ないので、Yの最大ビット数に合わせて足らない分を0で埋めることにする
22は010110
18は010010
35は100011
10は001010
これを反転すると
101001
101101
011100
110101
となる
順番に並べると
101001101101011100110101
となる
さすがに36進数に元通りにしようと思うとややこしすぎるので、今回は10進数に変換する
全部で24桁なので
8,388,608/4,194,304/2,097,152/1,048,576/524,288/262,144/131,072/65,536/32,768/16,384/8,192/4,096/2,048/1,024/512/256/128/64/32/16/8/4/2/1
まで使う
とりあえず、足しておくものを並べていくと
8,388,608 + 2,097,152 + 262,144 + 131,072 + 32,768 + 16,384 + 4,096 + 1,024 + 512 + 256 + 32 + 16 + 4 + 1
となります
※ちなみに、2進数の色と10進数の色は同じところを示しているはずです
合計は以下の通り
10,934,069
この数字を2進数に直して、36進数に置きなおしたら元に戻ります
(数字を文字に置きなおすやり方は16進数と同じ要領。先に数字を出して、該当する文字に置き換える方法)
ちなみにこれと似た方法を暗号でも使ってたりします。
(例:エニグマ。文字列をギアとジャンプ線の組み合わせで暗号・復号が出来る仕組み。同じダイヤル・同じ配線じゃないと復号できないようになっている)
というわけでしょーもなさ過ぎることの覚書でした