/ / Rozpakowywanie adresu IPv6 z inet_pton - perl

Rozpakowywanie adresu IPv6 z inet_pton - perl

Używałem następujących funkcji jako podstawy dla wielu moich kodów obliczeniowych IP od lat Wymagają one tylko wbudowanego modułu Socket, więc były bardzo przenośne.

sub ip2int { return( unpack("N",inet_aton(shift)) ) };
sub int2ip { return( inet_ntoa(pack("N",shift)) ) };

Próbowanie tego samego z Socket6 nie wydaje się działać:

Próba 1:

$ perl -MSocket6 -e "$x = inet_pton(AF_INET6,"2000::1"); print unpack("q",$x) . "n""
32

Próba 2:

$ perl -MSocket6 -e "$x = inet_pton(AF_INET6,"2000::1"); print
unpack("Q",$x) . "n""
32

Próba 3:

$ perl -MSocket6 -e "$x = inet_pton(AF_INET6,"2000::1"); print unpack("N",$x) . "n""
536870912

Nie mogę dowiedzieć się, jak uzyskać wartość całkowitą adresu, dzięki czemu mogę użyć arytmetyki dla moich obliczeń związanych z siecią.Jak każdy ma jakieś pomysły?

Odpowiedzi:

3 dla odpowiedzi № 1

Adresy IPv6 mają 128 bitów.

$ perl -e"
use feature qw( say );
use Socket6 qw( inet_pton AF_INET6 );
say 8*length(inet_pton(AF_INET6, "2000::1"));
"
128

Jest mało prawdopodobne, że masz Perla, który obsługuje 128-bitowe liczby całkowite. Możesz skorzystać z pomocy Matematyka :: 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