1

開始 IPv4 IP アドレス5.39.28.128(または::ffff:5.39.28.128) と IPv6 ネットワーク マスク長122があります。範囲内の最後の IP を計算するにはどうすればよいですか?

開始 IP をバイナリに変換する必要があると思います。これは以下のように行っています。そこからどこに行って終了 IP を取得すればよいかわかりません。

$ipNumber = ip2long('5.39.28.128');
$ipBinary = decbin($ipNumber);

echo $ipBinary; // 101001001110001110010000000

その理由は、MaxMind GeoIP データベースを CSV 形式で MySQL データベースにインポートしているためです (したがって、必要に応じて MySQL 関数を使用できます)。MaxMind は終了 IP を提供しなくなり、代わりに開始 IP と IPv6 ネットワーク マスク長を提供するようになりました。

4

2 に答える 2

2

解決策は非常に簡単です:

// Your input data
$networkstart = '5.39.28.128';
$networkmask = 122;

// First find the length of the block: IPv6 uses 128 bits for the mask
$networksize = pow(2, 128 - $networkmask);

// Reduce network size by one as we really need last IP address in the range,
// not first one of subsequent range
$networklastip = long2ip(ip2long($networkstart) + $networksize - 1);

$networklastip には、範囲内の最後の IP アドレスが含まれます。

これは、IPv6 アドレス空間の IPv4 アドレスに対してのみ有効なソリューションです。それ以外の場合は、ip2long/long2ip の代わりに IPv6 to/from 128 ビット整数関数を使用する必要があります。ただし、実際の IPv6 データをまだ見ていないため、上記の MaxMind データ コードで使用するには十分です。

于 2014-06-06T10:11:06.577 に答える