javaでIPアドレスをintへ変換する方法

前回書いた記事にゴミが付いたので、再投稿。

javaのソースにInet4Address.javaというのがあるのだが、
これを使うときにIPアドレスをどうやってint型に変換する必要がある。
だが、IPアドレスをどうやってint型に変換するのか想像が付かなかった。
しかし、Inet4Addressのソースコードを読むことでようやく理解できた。

まずint型は32ビットである。
IPアドレスもxx.xx.xx.xxの形式で各xx(以下オクテット)は8ビットであり、計32ビットである。

問題はどうやってIPアドレスをint型へ変換するかである。
それはシフト演算やor、and演算を使って行う。

int型0を32ビットで表すと以下のようになる。

0000 0000 0000 0000 0000 0000 0000 0000 //int型の0

このようりょうでIPアドレスの各オクテットをint型の数字と見なしたとき、
IPアドレス192.168.11.1は以下の通りとなる。

0000 0000 0000 0000 0000 0000 1100 0000 //192
0000 0000 0000 0000 0000 0000 1010 1000 //168
0000 0000 0000 0000 0000 0000 0000 1011 //11
0000 0000 0000 0000 0000 0000 0000 0001 //1

これらを第一オクテットから順番にビットを左へ移動させる。

1100 0000 0000 0000 0000 0000 0000 0000 //192 第一オクテットだから左へ24シフト(<<)
0000 0000 1010 1000 0000 0000 0000 0000 //168 第二オクテットだから左へ16シフト(<<)
0000 0000 0000 0000 0000 1011 0000 0000 //11 第三オクテットだから左へ8シフト(<<)
0000 0000 0000 0000 0000 0000 0000 0001 //1 第四オクテットだから左へ0シフト(<<)

こうやって見ると、各オクテットのビットが他のオクテットのビットと混ざらずに独立している事が分かる。
で、これらをor演算するとIPアドレスが一つのint型の数字になる。

1100 0000 0000 0000 0000 0000 0000 0000 //元192
0000 0000 1010 1000 0000 0000 0000 0000 //元168
0000 0000 0000 0000 0000 1011 0000 0000 //元11
0000 0000 0000 0000 0000 0000 0000 0001 //元1
------------------------------------------------------------------------------------//or演算
1100 0000 1010 1000 0000 1011 0000 0001 //IPアドレスを一つにまとめた値

これでIPアドレスが一つのintで表すことが出来た。
これでようやくInet4Addressオブジェクトを使うことが出来る。

一つにしたのはいい。しかし、今度はこれから元のIPアドレスを取り出すにはどうしたらいいか。
今度は先ほどと逆の事をすればいい。
それぞれのオクテットを見ていく。

第一オクテット
0000 0000 0000 0000 0000 0000 1100 0000 //右へ24シフト演算(>>)
0000 0000 0000 0000 0000 0000 1111 1111 //0xFF
------------------------------------------------------------------------------------//and演算
0000 0000 0000 0000 0000 0000 1100 0000 //192

第二オクテット
0000 0000 0000 0000 1100 0000 1010 1000 //右へ16シフト演算(>>)
0000 0000 0000 0000 0000 0000 1111 1111 //0xFF
------------------------------------------------------------------------------------//and演算
0000 0000 0000 0000 0000 0000 1010 1000 //168

第三オクテット
0000 0000 1100 0000 1010 1000 0000 1011 //右へ8シフト演算(>>)
0000 0000 0000 0000 0000 0000 1111 1111 //0xFF
------------------------------------------------------------------------------------//and演算
0000 0000 0000 0000 0000 0000 0000 1011 //11

第四オクテット
1100 0000 1010 1000 0000 1011 0000 0001 //右へ0シフト演算(>>)
0000 0000 0000 0000 0000 0000 1111 1111 //0xFF
------------------------------------------------------------------------------------//and演算
0000 0000 0000 0000 0000 0000 0000 0001 //1

0xFFでand演算を行うのは、第四オクテットとかを見ると分かるように、
関係のない部分にどんな値が来ようとも必要な値の部分に影響がないようにするためである。

次はそれらを用いたソースコードを書く予定。