Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP计算IPv6与IPv4的IP地址长格式数_Php_Ipv6_Ipv4 - Fatal编程技术网

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

使用PHP计算IPv6与IPv4的IP地址长格式数,php,ipv6,ipv4,Php,Ipv6,Ipv4,目前,我有两种计算IPv4长格式整数的方法: //IPv4 format: w.x.y.z $ip_number = (16777216 * $w) + (65536 * $x) + (256 * $y) + $z; $ip_number = ip2long($ip); 但是,如何将IPv6计算为长格式整数 我正在寻找一个不需要我安装任何PHP扩展的函数或东西 编辑: 我需要长格式的整数,这样我就可以在IP范围查询中比较它。以下是IPv6范围查询的示例行: "58569075684585412

目前,我有两种计算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 )
inet_ntop()示例 我们在上面演示了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";
}

if($ip好的,下面是我最终解决问题的方法:

function ipaddress_to_ipnumber($ipaddress) {
    $pton = @inet_pton($ipaddress);
    if (!$pton) { return false; }
    $number = '';
    foreach (unpack('C*', $pton) as $byte) {
        $number .= str_pad(decbin($byte), 8, '0', STR_PAD_LEFT);
    }
    return base_convert(ltrim($number, '0'), 2, 10);
}

您需要128位整数来处理IPv6地址。您可能需要使用整数数组。据我所见,IPv6的最高IP整数长度为38位。我发现128位整件事非常令人困惑……表示大多数“数字”需要超过一位。当然,一定有一些简单的公式来计算它?它只是一个整数(虽然很长),不是吗?:)IPv6字符串可以是32个十六进制数字长(IPv6地址中的八个字中每个字有四个十六进制数字)。每个十六进制数字代表4位,所以
4*32=128
位。我不打算存储它。我将它与ip范围表进行比较。这就是为什么我需要它的长格式-查询:)请参阅编辑的答案。至少你会得到一些建议谢谢,我认为你给我指明了正确的方向。必须阅读有关此的所有文档:)
if ($ip <= $high_ip && $low_ip <= $ip) {
  echo "in range";
}
function ipaddress_to_ipnumber($ipaddress) {
    $pton = @inet_pton($ipaddress);
    if (!$pton) { return false; }
    $number = '';
    foreach (unpack('C*', $pton) as $byte) {
        $number .= str_pad(decbin($byte), 8, '0', STR_PAD_LEFT);
    }
    return base_convert(ltrim($number, '0'), 2, 10);
}