Qual é a maneira mais simples de adicionar um para uma cadeia binária em Perl?
Pergunta
I tem uma variável que contém um byte 4, rede-fim IPv4 (esta foi criada usando pacote e a representação de número inteiro). I tem outra variável, também de uma rede de ordem 4 byte, sub-rede. Estou tentando adicioná-los juntos e adicionar um para obter o primeiro IP na sub-rede.
Para obter a representação ASCII, eu posso fazer inet_ntoa($ip&$netmask)
para obter o endereço base, mas é um erro fazer inet_ntoa((($ip&$netmask)+1)
; Eu recebo uma mensagem do tipo:
Argument "\n\r&\0" isn't numeric in addition (+) at test.pm line 95.
Então, o que está acontecendo, o melhor que eu posso dizer, é que está a olhar para os 4 bytes, e vendo que os 4 bytes não representam uma seqüência numérica, e em seguida, recusando-se a adicionar 1.
Outra maneira de colocá-lo: O que eu quero fazer é adicionar 1 para o byte menos significativo, o que eu sei é o quarto byte? Ou seja, eu quero tirar o \n\r&\0
corda e acabar com o \n\r&\1
string. Qual é a maneira mais simples de fazer isso?
Existe uma maneira de fazer isso sem ter que descompactar e re-embalar a variável?
Solução
O que está acontecendo é que você faz uma cadeia de bytes com $ip&$netmask
, e então tentar tratá-lo como um número. Isso não vai funcionar, como tal. O que você tem que alimentar a inet_ntoa
é.
pack("N", unpack("N", $ip&$netmask) + 1)
Eu não acho que há uma maneira mais simples de fazê-lo.
Outras dicas
inteiros e strings confusas. Talvez o seguinte código vai ajudar:
use Socket;
$ip = pack("C4", 192,168,250,66); # why not inet_aton("192.168.250.66")
$netmask = pack("C4", 255,255,255,0);
$ipi = unpack("N", $ip);
$netmaski = unpack("N", $netmask);
$ip1 = pack("N", ($ipi&$netmaski)+1);
print inet_ntoa($ip1), "\n";
Que resultados:
192.168.250.1