开发者社区> 技术小胖子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

php实现ipv4转换ipv6

简介:
+关注继续查看

php实现ipv4转换ipv6

123534980.jpg

首先ipv6是什么?

IPv6是下一版本的互联网协议,也可以说是下一代互联网的协议,它的提出最初是因为随着互联网的迅速发展,IPv4定义的有限地址空间将被耗尽,地址空间的不足必将妨碍互联网的进一步发展。为了扩大地址空间,拟通过IPv6重新定义地址空间。IPv4采用32位地址长度,只有大约43亿个地址,估计在2005-2010年间将被分配完毕,而IPv6采用128位地址长度,几乎可以不受限制地提供地址。


ipv4转换ipv6原理:

我们知道 ipv4的地址是32位二进制用点分十进制表示。

而ipv6的地址是128位二进制 通常用8组16进制数表示。

所以,想要写出兼容的ipv6地址。 只需要把32位的ipv4地址 转化成十六进制写法就可以了。

也就是说前面96位都是0,后面32位用ipv4的地址表示出来就可以。(其中::表示全是零)


php实现ipv4转换ipv6代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
例如百度www.baidu.com 的ipv4是220.181.111.85,<br />将它转换成ipv6:<br />
<?php
function getNormalizedIP($ip) {
    if (($ip == '0000:0000:0000:0000:0000:0000:0000:0001') OR ($ip == '::1')) {
        $ip '127.0.0.1';
    }
    $ip strtolower($ip);
    // remove unsupported parts
    if (($pos strrpos($ip'%')) !== false) {
        $ip substr($ip, 0, $pos);
    }
    if (($pos strrpos($ip'/')) !== false) {
        $ip substr($ip, 0, $pos);
    }
    $ip = preg_replace("/[^0-9a-f:\.]+/si"''$ip);
    // check address type
    $is_ipv6 = (strpos($ip':') !== false);
    $is_ipv4 = (strpos($ip'.') !== false);
    if ((!$is_ipv4) AND (!$is_ipv6)) {
        return false;
    }
    if ($is_ipv6 AND $is_ipv4) {
        // strip IPv4 compatibility notation from IPv6 address
        $ip substr($ipstrrpos($ip':') + 1);
        $is_ipv6 = false;
    }
    if ($is_ipv4) {
        // convert IPv4 to IPv6
        $ip_parts array_pad(explode('.'$ip), 4, 0);
        if (count($ip_parts) > 4) {
            return false;
        }
        for ($i = 0; $i < 4; ++$i) {
            if ($ip_parts[$i] > 255) {
                return false;
            }
        }
        $part7 base_convert(($ip_parts[0] * 256) + $ip_parts[1], 10, 16);
        $part8 base_convert(($ip_parts[2] * 256) + $ip_parts[3], 10, 16);
        $ip '::ffff:'.$part7.':'.$part8;
    }
    // expand IPv6 notation
    if (strpos($ip'::') !== false) {
        $ip str_replace('::'str_repeat(':0000', (8 - substr_count($ip':'))).':'$ip);
    }
    if (strpos($ip':') === 0) {
        $ip '0000'.$ip;
    }
    // normalize parts to 4 bytes
    $ip_parts explode(':'$ip);
    foreach ($ip_parts as $key => $num) {
        $ip_parts[$key] = sprintf('%04s'$num);
    }
    $ip = implode(':'$ip_parts);
    return $ip;
}
$myip="220.181.111.85";
echo '<b style="color:#00f">'.getNormalizedIP($myip).'</b>';
?>





      本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/1204722,如需转载请自行联系原作者




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
PHP 简单 对象 (object) 与 数组 (array) 的转换
PHP 简单 对象 (object) 与 数组 (array) 的转换
0 0
php转换文本编码,php字符编码转换,php编码转换
php转换文本编码,php字符编码转换,php编码转换
0 0
php将警告转换为异常
php将警告转换为异常
0 0
解决php无法将string转换为json的办法
解决php无法将string转换为json的办法
0 0
PHP转换几小时前
【代码】PHP转换几小时前。
0 0
Python/PHP/JS对象与json数据的转换key顺序问题
Python/PHP/JS对象与json数据的转换key顺序问题
0 0
PHP函数运用之怎么进行进制的转换
在上一篇文章《PHP函数运用之返回某个日期的前一天和后一天》中,我们介绍了利用strtotime() 函数获取给定日期前一天和后一天日期、前一月和后一月日期、一周和后一周的日期等方法,感兴趣的朋友可以学习了解一下~ 本文的重点是“进制转换”,介绍一下二进制数和十进制数的相互转换、十进制数和十六进制数的相互转换、十进制数和八进制数的相互转换。 二进制数和十进制数的相互转换 1、二进制数转十进制数 可以使用 bindec(二进制字符串) 函数,它可把二进制数转换为十进制数。
0 0
浅析PHP中处理HTML特殊字符转换
本文我们一起学习了解了PHP处理HTML中特殊字符的方法。对比htmlentities和htmlspecialchars两个PHP函数的功能作用。
1967 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
PHP安全开发_从白帽角度做安全
立即下载
PHP在机器学习上的应用及云深度学习平台的架构设计与实现
立即下载
PHP与APM_技术内幕和最佳实践
立即下载