Qual é a maneira mais simples de adicionar um para uma cadeia binária em Perl?

StackOverflow https://stackoverflow.com/questions/222043

  •  03-07-2019
  •  | 
  •  

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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top