2011-07-08 34 views
6

我需要将ipv6地址转换为其半字节格式,以便动态创建ptr记录。下面是我从维基百科获得的信息:将IPV6转换为PTR记录的半字节格式

逆转的IPv6解决

反向DNS查找IPv6地址 使用特殊的域ip6.arpa。 IPv6地址在此 域中显示为 反向顺序的半字节序列,表示为 十六进制数字作为子域。例如,对于 示例,对应于IPv6地址 2001:db8 :: 567:89ab的指针域名 是 ba9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8。 bd0.1.0.0.2.ip6.arpa。

我能找到的关于半字节的唯一的东西是包函数http://www.php.net/pack。我找不到任何解决方法,例如用google搜索这个问题。

任何帮助,非常感谢。

回答

10

给定适当的现代版本的PHP(在Windows上> = 5.1.0或5.3+),请使用inet_pton函数将IPv6地址解析为16字节的数组,然后使用标准字符串操作符将其反转。

$ip = '2001:db8::567:89ab'; 
$addr = inet_pton($ip); 
$unpack = unpack('H*hex', $addr); 
$hex = $unpack['hex']; 
$arpa = implode('.', array_reverse(str_split($hex))) . '.ip6.arpa'; 
+0

谢谢Alnitak这工作完美! –

-1

那么,从这个例子中,你可以看到半字节格式是完整的ipv6地址(包括0个字段),相反,然后分割成字符并用句点分隔。因此,我个人只会使用字符串表示法并根据需要对其进行处理。

+1

解析简称IPv6地址是不平凡的 - 最好离开它的设计做到这一点的库函数。 – Alnitak

2

这是反向的基础上,参宿一的伟大的代码,在函数的形式:

function ptr_to_ipv6($arpa) { 
    $mainptr = substr($arpa, 0, strlen($arpa)-9); 
    $pieces = array_reverse(explode(".",$mainptr)); 
    $hex = implode("",$pieces); 
    $ipbin = pack('H*', $hex); 
    $ipv6addr = inet_ntop($ipbin); 

    return $ipv6addr; 
} 
3

可以使用ipv6calc命令(UNIX/Linux)的行工具从here

例如:

$ ./ipv6calc --out revnibbles.arpa 2001:db8::1 
No input type specified, try autodetection...found type: ipv6addr 
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. 

您可以嵌入这是一个脚本来正向区域文件并创建PTRs

0

我这样做:

function expand($ip){ 
    $hex = unpack("H*hex", inet_pton($ip)); 
    $ip = substr(preg_replace("/([A-f0-9]{4})/", "$1:", $hex['hex']), 0, -1); 
    return $ip; 
} 

function ipv6_reverse_calc($address){ 
    $rev = chop(chunk_split(strrev(str_replace(':', '', expand($address))), 1, '.'), '.'); 
    return "$rev.ip6.arpa"; 
}