使用PHP计算IPv6与IPv4的IP地址长格式号

艾米·内维尔

目前,我有两种方法来计算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"
萨扎德(Sazzad Hissain Khan)

意见建议:

长时间存放不是这样做的正确方法。使用,

string inet_ntop ( string $in_addr )

此函数将32位IPv4或128位IPv6地址(如果PHP是在启用了IPv6支持的情况下构建的)转换为地址族适当的字符串表示形式。

您还应该看到,

string inet_pton ( string $address )

inet_ntop()示例

<?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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使IPv4请求IP使用IPv4表示法代替IPv6

来自分类Dev

从IPv4获取IPv6地址?

来自分类Dev

域名可以同时具有IP地址(IPv6和IPv4)吗?

来自分类Dev

如何使用AFNetworking将ipv4地址转换为ipv6?

来自分类Dev

PHP:匹配IP之间的范围?(IPv4和IPv6)

来自分类Dev

PHP 如何检查提供的 IP 范围是 IPv4 还是 IPv6

来自分类Dev

使用IPV4访问IPV6

来自分类Dev

使用IPV4访问IPV6

来自分类Dev

如何使用Java确定正在运行的计算机是使用ipv4还是ipv6?

来自分类Dev

存储和检索IPv4和IPv6地址

来自分类Dev

ipv4和ipv6来自任何有效地址

来自分类Dev

查找给定IPv4 / IPv6地址的域(不是rDNS / PTR)

来自分类Dev

IPv4和IPv6地址检查器

来自分类Dev

如何在Swift中验证IPv4和IPv6地址?

来自分类Dev

如何检测源地址是IPv4还是IPv6

来自分类Dev

通过IPv4询问IPv6地址

来自分类Dev

我同时拥有IPv4和IPv6公共地址。为什么?

来自分类Dev

为什么接口同时显示ipv6地址和ipv4

来自分类Dev

Linux netstat显示ipv4映射的ipv6地址

来自分类Dev

如何过滤IPv4和IPv6地址?

来自分类Dev

IPv4和IPv6地址检查器

来自分类Dev

从仅IPv4的网络访问IPv6计算机。是否有可能?

来自分类Dev

将CIDR表示法中的IPv4 IP范围映射到IPv6

来自分类Dev

创建IPv4和IPv6 SPF记录

来自分类Dev

golang区分IPv4 IPv6

来自分类Dev

ipv4映射的ipv6验证

来自分类Dev

从IPv4到IPv6的ssh

来自分类Dev

从仅IPv4到仅IPv6的VPN

来自分类Dev

IPv6正常工作,但IPv4无效