0

フォーラムを検索してみましたが、どこにも見つかりませんでした。CIDR ブロックを完全に分解するものを見つけましたが、2 つの機能が別々に必要です。

最初の関数は、/24 より大きい CIDR ブロックを受け取り、それを /24 ブロックに分割します。

私が実際にほとんど行った 2 番目の関数は、各 /24 を 256 個の IP アドレスに分割します。その答えはここにあります。 PHPで特定のIP範囲を爆発させる

そのため、/23 以上の CIDR ブロックが渡される関数を作成し、それを /24 に分割する方法を理解しようとしています。

例:
入力: BreakTo24(10.0.0.0/22)

出力:
10.0.0.0/24
10.0.1.0/24
10.0.2.0/24
10.0.3.0/24

編集:コードの試行を投稿していないことに気付きました。これにより、おそらくこれを支援することがより困難になります。コードは次のとおりです。

function BreakTo24($CIDR){
    $CIDR = explode ("/", $CIDR);
    //Math to determine if the second part of the array contains more than one /24, and if so how many.
4

1 に答える 1

3

私は (IRC の助けを借りて) これを効果的に行っていないことに気付き、ip2long 関数を使用する必要がありました。

私はこれをテストしましたが、それは私が望んでいたことを実行しました。これが私の完成したコードです。うまくいけば、誰かが役に立つと思います。

// Function to take greater than a /24 CIDR block and make it into a /24
Function BreakTo24($CIDR)
{
    $CIDR = explode("/", $CIDR); // this breaks the CIDR block into octlets and /notation
    $octet = ip2long($CIDR[0]); //turn the first 3 octets into a long for calculating later
    $NumberOf24s = pow(2,(24-$CIDR[1]))-1; //calculate the number of /24s in the CIDR block
    $OutputArray = array();
    for ($i=-256; $i<256 * $NumberOf24s; $OutputArray[] = (long2ip($octet + ($i += 256)))); //fancy math to output each /24
    return $OutputArray; //returns an array of ranges

}

于 2013-09-20T10:16:30.977 に答える