ネットマスク / ビットカウント表記法

IPの範囲指定って有るんですけど。

255.0.0.0 255.128.0.0
こういうの。

これを、例えば.htaccessで使うときは、ビットカウント表記法で指定すると便利。

255.0.0.0/8
こんな感じ。

しかしねぇ…この計算が以外に面倒。
ドットで区切られたそれぞれを、2進数に変換して、8桁ずつ並べて…
という理屈は分かるし、冷静に計算すれば別に出来るんだけどね…
めんどくせぇって(泣)

計算方法
先頭と最後を2進数に変換する
255.0.0.0 → 11111111.00000000.00000000.00000000
255.128.0.0 → 11111111.10000000.00000000.00000000

左から見ていって、何ビット(何文字)共通してるかを見る。
この場合、赤字部分、8bitが固定されているので、
表記は、
255.0.0.0/8
となる。

というわけで、自分のためだけに、計算機を作成してみた。

ネットマスクのビット表記法変換

エラー処理すらしてない上に、計算も力業で数学じゃない、
ていうか、本当に合ってるかすらも自信ない、けどまぁ…
個人使用には十分耐えるでしょ、ってことで。
ずいぶん楽になりました。
(数学的処理知ってる人は教えてください。はい)
ネット検索してもそれらしい物に当たらないってことは、
多分、一般常識レベルなんでしょうなぁ…わからんやつは触るな、と。
まぁ、でも一応、リンクだけ貼っておこう。


ソース。
<?php
#===============================================================#
# IP範囲 -> ビットカウント表記法                #
#                       Version: 1.00.00 #
#===============================================================#
# 【概要】                            #
# ————————————————————- #
#  以下の変換を行う。                      #
#  202.181.96.0 <-> 202.181.107.0 → 202.181.96.0/20      #
#                                #
#  まずそれぞれを2進数に変換し、0を補って8桁にした後、      #
#  先頭から何文字が共通しているかを調べ、            #
#  その値を始点に付けて返す。                  #
#  数学のかけらもない、かなり強引な手段ではあるが。      #
#===============================================================#

if($_REQUEST[‘mode’] == “calc”){
  $bit = makemask($_REQUEST[‘decx’],$_REQUEST[‘decy’]);
}

#———————————————————–#
# 変換プログラム                      #
#———————————————————–#

function makemask($decx,$decy){
  for($i = 0;$i < 4;$i++){
    $binx[$i] = sprintf(“%08d”,decbin($decx[$i]));
    $biny[$i] = sprintf(“%08d”,decbin($decy[$i]));
  }
  $x = implode(“”,$binx);
  $y = implode(“”,$biny);
  for($i = 0;$i < 32;$i++){
    $cmp = strncmp($x,$y,($i + 1));
    if($cmp < 0){
      $nm = $i;
      break;
    }
  }
  return implode(“.”,$decx) . “/” . $nm . “<br>\n”;
}
?>
<html>
<head>
<title>ネットマスクのビット表記法変換</title>
<style>
div  {font:9pt Verdana;}
input  {font:9pt Verdana;width:50px;ime-mode:disabled;}
input.Submit  {font:bold 9pt Verdana;width:50px;}
</style>
</head>
<body>
<form method=”POST” action=”netmaskcalc.php”>
<input type=”hidden” name=”mode” value=”calc”>
<div>IPアドレス先頭</div>
<div>
<?php
for($i = 0;$i < 4;$i++){
  print “<input type=\”text\” name=\”decx[]\” maxlength=3>\n”;
}
?>
</div>
<div>IPアドレス最後</div>
<div>
<?php
for($i = 0;$i < 4;$i++){
  print “<input type=\”text\” name=\”decy[]\” maxlength=3>\n”;
}
?>
</div>
<input type=”submit” value=”CALC” class=”Submit”>
</form>
<?=$bit?>
</body>
</html>
※あまりに汚かったので少し直しました。(2005-2-19 20:24)