¿Cuál es la forma más sencilla de agregar uno a una cadena binaria en Perl?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Tengo una variable que contiene una dirección IPv4 de orden de red de 4 bytes (esto se creó mediante el paquete y la representación entera). Tengo otra variable, también una subred de orden de red de 4 bytes. Estoy intentando agregarlos juntos y agregar uno para obtener la primera IP en la subred.

Para obtener la representación ASCII, puedo hacer inet_ntoa ($ ip & amp; $ netmask) para obtener la dirección base, pero es un error hacer inet_ntoa ((($ ip & amp; $ máscara de red) +1) ; recibo un mensaje como:

 Argument "\n\r&\0" isn't numeric in addition (+) at test.pm line 95.

Entonces, lo que está sucediendo, lo mejor que puedo decir, es que está mirando los 4 bytes, y viendo que los 4 bytes no representan una cadena numérica, y luego se niega a agregar 1.

Otra forma de expresarlo: lo que quiero que haga es agregar 1 al byte menos significativo, que sé que es el 4to byte. Es decir, quiero tomar la cadena \ n \ r & amp; \ 0 y terminar con la cadena \ n \ r & amp; \ 1 . ¿Cuál es la forma más sencilla de hacer eso?

¿Hay alguna forma de hacerlo sin tener que desempaquetar y volver a empaquetar la variable?

¿Fue útil?

Solución

Lo que sucede es que crea una cadena de bytes con $ ip & amp; $ netmask , y luego trata de tratarla como un número. Esto no va a funcionar, como tal. Lo que tiene que alimentar a inet_ntoa es

pack("N", unpack("N", $ip&$netmask) + 1)

No creo que haya una forma más sencilla de hacerlo.

Otros consejos

Enteros y cadenas confusos. Quizás el siguiente código ayude:

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";

Qué resultados:

192.168.250.1
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top