URLエンコードとは関係ありません

 

16進数を文字列に自動変換&その逆をするツール

Google等で日本語で検索すると、URL欄に不気味な文字列が並ぶ。これをURLエンコードと言うらしい。

 

 

例えば

https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A%E3%81%8B%E3%81%8D%E3%81%8F%E3%81%88

↑これは「あいうえおかきくえ」と検索したときのURL。

ひらがなは9文字ですが、URLの%の区切りは27つある。

しかも「E3」が9回あって、間隔も2個開いている。

非常に不気味である。

 

上のツールで16進数にしてもらいました!!

e38182e38184e38186e38188e3818ae3818be3818de3818fe38188

どうやら、ひらがな1文字は6文字の英数字に変換されるらしい。

 

パーセントエンコーディング - Wikipedia

UTF-8にあたる。URLなどでは日本語が使えないから%の記号を用いた文字列に変換する。

 

ひらがな、カタカナ、漢字などは6文字に変換されたが、a~z、1~0などはどうだろうか。

noob」→6e6f6f62

2文字だ。

どうやら英数字1文字は英数字2文字に変換されるらしい。

 

0~9は30~39に変換される

 

多重エンコード

残念ながら、ここからエンコードを2回3回と重ねる。

まずは「糞」から。うんち。

「糞」→e7b39e(1回目)

 

このe7b39eをエンコードする。

e7b39e→653762333965(2回目)

全部数字になった。というのも、最初のエンコードは0~fに変換される。

0~fをエンコードすると全て数字になるため、2回目は全て数字になるというわけだ。

 

このままどんどんエンコードを重ねていく。

653762333965→363533373632333333393635(3回目)

363533373632333333393635→333633353333333733363332333333333333333933363335(4回目)

333633353333333733363332333333333333333933363335→333333363333333533333333333333373333333633333332333333333333333333333333333333393333333633333335(5回目)

 

3がどんどん増えている。

333333333333333633333333333333353333333333333333333333333333333733333333333333363333333333333332333333333333333333333333333333333333333333333333333333333333333933333333333333363333333333333335(6回目)

 

ここでちょっと中断。

あまりにも3が増えすぎた。ここで問題。

(1)6回目の文字数は。

(2)6回目の3以外の文字数は。

(3)6回目の3の文字数は。

 

(1)は簡単だ。2回目からは文字数が2倍ずつ増えている

1回目の文字数は6文字だから、6回目には6*2^(6-1)=192文字。

 

(2)も数えればわかるが、8文字だ。

でも注目すべきなのは2回目~5回目のとき。

2回目…8文字 3回目…8文字 4回目…8文字 5回目…8文字 6回目…8文字

変わっていない。なぜなのか

数字の0~9は30~39に変換されるから。(例えば45 → 3435)

このとき元の数は残るというわけだ

 

(3)は3の文字数なので全体から3以外の文字数を引けばよい。192-8=184

 

さて、他にも適用させよう。

n回目の16進数変換(n≧3)

a = 2回目変換のときの3の文字数

b = 2回目変換のときの3以外の文字数

 

文字数=(a+b)*2^(n-2)

どんどん2倍,それを2倍と繰り返しているので2の累乗を使います

また、a+bは2回目の文字数なのでn=2の時に2^0にします。なので指数は(n-2)です。

 

3以外の文字数=b

3以外の文字数はさっき説明した通り変わりません。

 

3の文字数 = {(a+b)*2^(n-2)}-b

3の文字数は全体の文字数から3以外の文字数を引いた数です。

おれは3→33となることから{a*2^(n-2)}+{b*2^(n-2)-b}より求めました

 

ここで、33回目の全体の文字数、3の文字数、3以外の文字数を求めてみましょう。

2回目は653762333965。3の文字数は4、3以外の文字数は8。

ここですぐにわかります。

全体の文字数は(4+8)*2^(33-2) = 12*2^31 = 25769803776文字

3以外の文字数は8文字。

3の文字数は25769803776 - 8 = 25769803768文字

あっという間に終わりましたね…

 

適当になってきたからいい話で終わらせる

実際に33回変換して文字数をカウントするよりも、このように文字数を計算で求める方が圧倒的に速いです。(適当)

また少し工夫すれば、実際に変換しなくても3以外の文字数の間に3が何個挟まっているか計算することができます。(適当)

 

ご覧いただきありがとうございました