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,如需转载请自行联系原作者