2008-10-21 17 views
7

Tengo una variable que contiene una dirección IPv4 de orden de red de 4 bytes (esto se creó usando el paquete y la representación entera). Tengo otra variable, también una subred de orden de red de 4 bytes. Intento agregarlos y agregar uno para obtener la primera IP en la subred.¿Cuál es la forma más sencilla de agregar uno a una cadena binaria en Perl?

Para obtener la representación ASCII, puedo hacer inet_ntoa($ip&$netmask) para obtener la dirección base, pero es un error hacer inet_ntoa((($ip&$netmask)+1); Me sale un mensaje como:

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

Así que lo que está pasando, lo mejor que puedo decir, es que es Mirando a los 4 bytes, y al ver que los 4 bytes no representan una cadena numérica, y luego negarse a add 1.

Otra forma de decirlo: ¿Qué quiero hacer es agregar 1 al byte menos significativo, que sé que es el 4º byte? Es decir, quiero tomar la cadena \n\r&\0 y terminar con la cadena \n\r&\1. ¿Cuál es la forma más simple de hacer eso?

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

Respuesta

13

Lo que ocurre es que crea una cadena de bytes con $ip&$netmask, y luego trata de tratarlo 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 exista una forma más sencilla de hacerlo.

+0

Creo que puedes tener razón. Solo estaba tratando de ver si había una manera más simple, pero, por desgracia, puede que no exista. –

8

Confundiendo números enteros y cadenas. Tal vez el siguiente código ayudará a:

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 da salida:

192.168.250.1 
Cuestiones relacionadas