ロングIPアドレス

IPアドレスとは、xxx.xxx.xxx.xxx と、8bitの数値4つ(つまり32bit)で構成されるIPアドレス
10進数で表現する方法をつい最近知った。
なるほどねーと思ったので、備忘。

予備知識

ネットワークにおいて 8bitは、1octet(オクテット)という単位で表す。
8bit は普通 1byte だけれど、1byte は 7bit か 8bit のどちらかを表す。


引用 http://mag.autumn.org/Content.modf?id=20040401113214

 実は、1byteが何ビットなのかは決まってなどいないのです。
 手近にある(既にちょっと古い)JIS情報ハンドブックから適当に引いてきてみましょう。
JIS X 0202-1991より
5.1.2 バイト(byte) 一つの単位として扱うビット列のことであって、その長さは冗長検査技術やフレーミング技術の影響を受けない。
 この定義のどこにも8bitとは書いてありません。
 しかし、8bit以外で使うことなどあるのかと思う人もいると思うので、もう1つ同じハンドブックから引用します。
JIS X 0208-1990より
4.1 符号の単位 この規格で規定する符号の単位は、2バイトとする。各バイトは、JIS X 0201及びJIS X 0202による7単位又は8単位とする。
 7単位とは7bit、8単位とは8bitに相当します。つまり、ここではバイトは7bitであったり8bitであったりする、と言っているわけです。


引用元にも書いてあるけれど、普通に 1byte と言ったら8bitなわけで、僕もネットワーク関係でなければ気にしていない事項だったりする。
この前提項目で何が言いたいか…まとめると
オクテットって言ってるけど、1byte のことだぞー
・1byte 表記でも 8bit で使ってるぞー
ってだけ。

計算方法

8bit は、0〜255 までの256個の数値を表せる単位。
256進数と捉えれば、各オクテットの10進数に計算しなおせる。


例として、192.168.1.1 というIPアドレスを、それぞれ計算してみる。


192 → 192 * 256 * 256 * 256 = 3221225472
168 → 168 * 256 * 256 = 11010048
1 → 1 * 256 = 256
1 → 1 = 1


全てを足すと、3232235777 になる。
これがロングIPアドレスといわれる表記方法で、IEだと普通に使える。
Wikipediaを見ると計算式は整理されていて
((第1octet*256+第2octet)*256+第3octet)*256+第4octet=ロングIPアドレス
となっている。

逆算

ロングIPアドレスからIPアドレスを計算する方法は、計算を逆にする。
ただし、全て小数点は切り捨てる。


第1octet = ロングIPアドレス / 256 / 256 / 256 (小数点以下切捨て
第2octet = (ロングIPアドレス - 第1octet * 256 * 256 * 256) / 256 / 256(小数点以下切捨て
第3octet = (ロングIPアドレス - (第1octet * 256 * 256 * 256 + 第2octet * 256 * 256)) / 256 (小数点以下切捨て
第4octet = ロングIPアドレス - (第1octet * 256 * 256 * 256 + 第2octet * 256 * 256 + 第3octet * 256)


もう少しマシな計算方法*1はあるだろうけど、とりあえずコレで。


考え方としては、、、
32bit (10進数)の数値をそのまま 256(8bit) で3回割ってあげると、整数部が第1オクテットになる。
32bit (10進数)の数値から第1オクテット(上位8bit分)の数値を引いて、256で2回割ってあげれば整数部が第2オクテットになる。
32bit (10進数)の数値から第1オクテットと第2オクテット(上位16bit分)の数値を引いて、256で割ってあげれば整数部が第3オクテットになる。
32bit (10進数)の数値から第1オクテット〜第3オクテット(上位24bit分)の数値を引いてあげれば、そのまま第4オクテットになる。


…少数部分に bit 分を掛けてあげれば、わざわざ第1〜第3オクテットを再利用しなくても良いんだろうか?


どこで役にたつかは、わからないけど(^_^;


〜以下 2008.1.8 追記〜
PHPだと、わざわざ計算しなくても、関数が用意されているようだ。
long2ip や ip2long などらしい。
PHPは専門外なので、使い方などはググってほしい。


シェルにも用意されてないかなw

*1:たとえば、先に256を掛ける計算を済ませておくとか…ね