php實現ipv4轉換ipv6

技術小胖子發表於2017-11-08

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,如需轉載請自行聯絡原作者


相關文章