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,如需转载请自行联系原作者
今天的文章ipv4转ipv6地址转换_ipv4与ipv6之间怎么转换分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/71632.html