目前,我有两种方法来计算IPv4长格式整数:
//IPv4 format: w.x.y.z
$ip_number = (16777216 * $w) + (65536 * $x) + (256 * $y) + $z;
$ip_number = ip2long($ip);
但是,如何将IPv6计算为长整数?
我正在寻找一个功能或不需要我安装任何PHP扩展的东西。
编辑:
我需要长整数,以便可以将其与IP范围查询进行比较。这是IPv6范围查询的示例行:
"58569075684585412230123897272863293440","58569076873007849944088961176022548479","MU","Mauritius"
长时间存放不是这样做的正确方法。使用,
string inet_ntop ( string $in_addr )
此函数将32位IPv4或128位IPv6地址(如果PHP是在启用了IPv6支持的情况下构建的)转换为地址族适当的字符串表示形式。
您还应该看到,
string inet_pton ( string $address )
<?php
$packed = chr(127) . chr(0) . chr(0) . chr(1);
$expanded = inet_ntop($packed);
/* Outputs: 127.0.0.1 */
echo $expanded;
$packed = str_repeat(chr(0), 15) . chr(1);
$expanded = inet_ntop($packed);
/* Outputs: ::1 */
echo $expanded;
?>
在PHP 5.1.0inet_pton
和中引入了以下两个函数inet_pton
。它们的目的是将人类可读的IP地址转换为它们的打包in_addr
表示形式。由于结果不是纯二进制的,因此我们需要使用该unpack
函数来应用按位运算符。
这两个功能都支持IPv6和IPv4。唯一的区别是如何从结果中解压缩地址。使用IPv6,您将使用A16解压缩内容,而使用IPv4,则将使用A4解压缩内容。
从前面的角度来看,这里是一些示例输出,以帮助阐明:
// Our Example IP's
$ip4= "10.22.99.129";
$ip6= "fe80:1:2:3:a:bad:1dea:dad";
// ip2long examples
var_dump( ip2long($ip4) ); // int(169239425)
var_dump( ip2long($ip6) ); // bool(false)
// inet_pton examples
var_dump( inet_pton( $ip4 ) ); // string(4)
var_dump( inet_pton( $ip6 ) ); // string(16)
上面我们证明了inet_ *系列支持IPv6和v4。我们的下一步将是将打包结果转换为一个未打包的变量。
// Unpacking and Packing
$_u4 = current( unpack( "A4", inet_pton( $ip4 ) ) );
var_dump( inet_ntop( pack( "A4", $_u4 ) ) ); // string(12) "10.22.99.129"
$_u6 = current( unpack( "A16", inet_pton( $ip6 ) ) );
var_dump( inet_ntop( pack( "A16", $_u6 ) ) ); //string(25) "fe80:1:2:3:a:bad:1dea:dad"
注意:当前函数返回数组的第一个索引。等于说$ array [0]。
拆包后,我们可以看到与输入相同的结果。这是一个简单的概念证明,可确保我们不会丢失任何数据。
最终使用,
if ($ip <= $high_ip && $low_ip <= $ip) {
echo "in range";
}
参考:php.net
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句