それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

IPアドレス(v4)を整数値(int)に変換する。

ipアドレスをint に変換する

  • 10.0.0.0 -> 167772160
  • 10.0.0.1 -> 167772161

このように、IPアドレスを整数値に置き換えたい。

1 2 3 4
v4表記 10 0 0 1
2進数 0b00001010 0b00000000 0b00000000 0b00000001

3,4オクテットだけを見てみる。

1 2 3 4
v4表記 10 0 0 0
2進数 0b00001010 0b00000000 0b00000000 0b00000000
v4表記 10 0 0 1
2進数 0b00001010 0b00000000 0b00000000 0b00000001
v4表記 10 0 1 1
2進数 0b00001010 0b00000000 0b00000001 0b00000001

第4オクテットが1つ変わる場合 10.0.0.0 -> 10.0.0.1 には、整数値で1変化する

第3オクテットが1つ変わる場合 10.0.0.1 -> 10.0.1.1 には、整数値で256変化する

つまり、第3オクテットの変化量は、整数値で、256倍になる。

1オクテットは、10進数表記を2進数に直してるだけで、2進数の桁が上がるのです。(左へビットシフトを8回繰り返すので、28 だけ繰り上がる)

他の例も考えてみると

10.0 = (8+2)   . 0 = 0b00001010 *2^8 + 0b00000000
10.1 = (8+2)   . 1 = 0b00001010 *2^8 + 0b00000001
11.1 = (8+2+1) . 1 = 0b00001011 *2^8 + 0b00000001
12.1 = (8+4)   . 1 = 0b00001100 *2^8 + 0b00000001
13.1 = (8+4+1) . 1 = 0b00001101 *2^8 + 0b00000001

ここから考えると、

1 2 3 4
v4表記 10 0 0 1
整数値 {10}*{2}^{8}*{2}^{8}*{2}^{8} {0}*{2}^{8}*{2}^{8} {0}*{2}^{8} 1

もっと単純に考えると、実質的に256進数なので

1 2 3 4
v4表記 10 0 0 1
整数値 {10}*{256}^{4-1} {0}*{256}^{4-2} {0}*{256}^{4-3} {0}*{256}^{4-4}

上のようになり、結果として256進数を10進数に直すだけである。

IP アドレスを10進数(整数)に変換する

なので、IPアドレス(v4)を整数値(10進数)に変換するには 256を桁数n-1だけかければ良い

IP アドレス a.b.c.d があるとき、それを整数にするには。

 {a}*{256}^{(n-1)}+{b}*{256}^{(n-2)}+{c}*{256}^{(n-3)}+{d}*{256}^{(n-4)}

ただし、a,b,c,d は 0-255 で、256進数であり、n は桁数を表す。

で、256 は固定なので

a*256^3+ b * a*256^2+ c * 256^1 + d * 256^0

もっと単純に、算数に落とし込むと

a*16777216 + b * 65536 + c * 256 + d 

これだけである。