多年来,我一直使用以下功能作为我的许多IP计算代码的基础。它们只需要内置的perl模块Socket,因此它们非常便携。
sub ip2int { return( unpack("N",inet_aton(shift)) ) };
sub int2ip { return( inet_ntoa(pack("N",shift)) ) };
使用Socket6尝试相同的操作似乎不起作用:
尝试1:
$ perl -MSocket6 -e '$x = inet_pton(AF_INET6,"2000::1"); print unpack("q",$x) . "\n"'
32
尝试2:
$ perl -MSocket6 -e '$x = inet_pton(AF_INET6,"2000::1"); print
unpack("Q",$x) . "\n"'
32
尝试3:
$ perl -MSocket6 -e '$x = inet_pton(AF_INET6,"2000::1"); print unpack("N",$x) . "\n"'
536870912
我无法弄清楚如何获取地址的整数值,因此我可以使用算术进行网络相关的计算。有人有什么想法吗?
答案 0 :(得分:3)
IPv6地址大小为128位。
$ perl -e'
use feature qw( say );
use Socket6 qw( inet_pton AF_INET6 );
say 8*length(inet_pton(AF_INET6, "2000::1"));
'
128
你不太可能拥有支持128位整数的Perl。您可以获得Math::Int128
的帮助$ perl -e'
use feature qw( say );
use Socket6 qw( inet_pton AF_INET6 );
use Math::Int128 qw( net_to_uint128 );
say net_to_uint128(inet_pton(AF_INET6, "2000::1"));
'
42535295865117307932921825928971026433