我不会看ipv6的地址范围,比如下面这两个地址范围是指从哪个地址到哪个地址啊?
2406:6200::|32
240e:100::|24
为什么平时的ip库都是分开的,放在同一个表中会有什么问题吗?

解决方案 »

  1.   

    这都是16进制表示,2字节一个:。::表示接下来的都是0.mysql还是可以操作的,unhex啊,substring,replace啊,看你需求了。
      

  2.   

    我知道正常格式的ipv6地址,不知道怎么把这种含有CIDR的ipv6地址范围计算成一个ip地址范围
      

  3.   

    IP地址是可以按照字符串比较大小的, 要计算范围内的每一个IP, 可以gmp/bc直接当做大数运算, 我说的是PHP, 你有需求可以给你写个示例?
      

  4.   

    谢谢你的回复。
    我是想把ip地址文件转换成ip数据库,文件里面的ip范围是用CIDR方式表示的,就像一条一条
    apnic|LK|ipv6|2400:ff00::|32|20110603|allocated
    apnic|PK|ipv6|2401::|32|20061103|allocated
    这样的记录,我想把2400:ff00::|32转化成2400:ff00:0000:0000:0000:0000:0000:0000-某个范围这样一种形式,或者转化成某个整数到某个整数的范围。
      

  5.   

    [User:root Time:09:54:16 Path:/home/liangdong/php]$ php ip.php 
    2406:6200:0000:0000:0000:0000:0000:0000[User:root Time:09:54:17 Path:/home/liangdong/php]$ cat ip.php 
    <?php
    $ipv6_start = "2406:6200::";
    $ipv6_end = "240e:100::";// 扩展ipv6格式方便阅读
    $bin_start = inet_pton($ipv6_start);
    $bin_end = inet_pton($ipv6_end);
    $start = unpack('H*0', $bin_start)[0];
    $start = str_split($start, 4);
    $start = implode(":", $start);
    echo $start;/* 作为大数运算, 可以遍历start, end内所有IP地址
    $start = gmp_init($start, 16);
    $end = unpack('H*0', $bin_end)[0];
    $end = gmp_init($end, 16);
    echo gmp_strval($start, 16);
    */
    ?>写了个例子, 你看需求扩展。
      

  6.   


    注释部分要用的话把implode里边第一个参数换成""就行了。
      

  7.   

    2400:ff00::|32
    应该是从
    2400:ff00:0000:0000:0000:0000:0000:0000

    2400:ff00:0000:0000:0000:0000:ffff:ffff
    后面的CIDR是位数, 32位就是ffff:ffff
      

  8.   

    你好像说反了,2400:ff00::|32
    应该是从
    2400:ff00:0000:0000:0000:0000:0000:0000

    2400:ff00:ffff:ffff:ffff:ffff:ffff:ffff吧
      

  9.   

    不好意思啊,再请教你一下,我用inet_pton总是出现Warning: inet_pton(): Unrecognized address 2001:200:: in E:\www\test\a\step2\step2.php on line 63这样的出错,不知道为什么,好像不能识别这种格式啊