我需要将ipv6地址转换为其半字节格式,以便动态创建ptr记录。以下是我从维基百科获得的信息:
IPv6反向解析
IPv6地址的反向DNS查找 使用特殊域名ip6.arpa。一个 IPv6地址在此显示为名称 域作为一系列的半字节 逆序,表示为 十六进制数字作为子域。对于 例如,指针域名 对应IPv6地址 2001:db8 :: 567:89ab是 b.a.9.8.7.6.5.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。
关于半字节我唯一能找到的就是包函数http://www.php.net/pack。我用谷歌搜索问题的例子找不到任何解决方案。
非常感谢任何帮助。
答案 0 :(得分:12)
给出适当的现代版本的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';
答案 1 :(得分:3)
您可以使用here中的ipv6calc
命令(UNIX / Linux)行工具。
例如:
$ ./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
。
答案 2 :(得分:2)
这是基于Alnitak的优秀代码,以函数的形式反过来:
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 :(得分: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";
}
答案 4 :(得分:-1)
那么,从那个例子中,你可以看到半字节格式是完整的ipv6地址(包括0字段),反转,然后分成字符并用句点分隔。所以个人而言,我只会使用字符串表示并根据需要对其进行操作。