2017-08-16 77 views
0

多年來,我一直在使用以下函數作爲很多IP計算代碼的基礎。它們只需要內置的perl模塊Socket,所以它們非常便攜。從inet_pton解包IPv6地址

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 

我不知道如何獲得地址的整數值,所以我可以使用算術進行網絡相關的計算。有人有主意嗎?

回答

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