php实现ipv4转换ipv6

简介:

php实现ipv4转换ipv6

首先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 ( $ip strrpos ( $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,如需转载请自行联系原作者




相关文章
|
7月前
|
网络协议 PHP
php案例:判断这个是不是检测 IPv6 地址
php案例:判断这个是不是检测 IPv6 地址
php案例:判断这个是不是检测 IPv6 地址
|
缓存 移动开发 NoSQL
php结合redis实现高并发下的抢购、秒杀功能的实例
php结合redis实现高并发下的抢购、秒杀功能的实例
261 0
|
PHP
github与gitee代码自动同步到服务器实现PHP项目自动部署webhooks
github与gitee代码自动同步到服务器实现PHP项目自动部署webhooks
522 0
github与gitee代码自动同步到服务器实现PHP项目自动部署webhooks
|
网络协议 Linux 网络安全
php实现websocket实时消息推送
php实现websocket实时消息推送
541 0
php实现websocket实时消息推送
|
PHP
php实现数字格式化,数字每三位加逗号的功能函数169856420=&gt;169,856,420
php实现数字格式化,数字每三位加逗号的功能函数169856420=&gt;169,856,420
220 0
|
PHP
PHP实现Workerman实例 高性能PHP Socket即时通讯框架
PHP实现Workerman实例 高性能PHP Socket即时通讯框架
434 0
|
消息中间件 PHP Windows
PHP实现php-amqplib/php-amqplib实例RabbitMq
PHP实现php-amqplib/php-amqplib实例RabbitMq
293 0
|
XML 移动开发 JSON
PHP使用yansongda/pay实现支付宝和微信的支付
PHP使用yansongda/pay实现支付宝和微信的支付
1092 0
|
NoSQL PHP Redis
PHP结合redis实现点赞功能
PHP结合redis实现点赞功能
147 0