Qual è il modo più semplice di aggiungerne uno a una stringa binaria in Perl?
Domanda
Ho una variabile che contiene un indirizzo IPv4 di 4 byte, nell'ordine di rete (questo è stato creato usando il pacchetto e la rappresentazione intera). Ho un'altra variabile, anche una sottorete di ordine di rete a 4 byte. Sto cercando di aggiungerli insieme e aggiungerne uno per ottenere il primo IP nella sottorete.
Per ottenere la rappresentazione ASCII, posso fare inet_ntoa ($ ip & amp; $ netmask)
per ottenere l'indirizzo di base, ma è un errore fare inet_ntoa (((($ ip & amp; $ netmask) +1)
; ricevo un messaggio del tipo:
Argument "\n\r&\0" isn't numeric in addition (+) at test.pm line 95.
Quindi quello che sta succedendo, il meglio che posso dire, è guardare i 4 byte e vedere che i 4 byte non rappresentano una stringa numerica e quindi rifiutarsi di aggiungere 1.
Un altro modo per dirlo: quello che voglio che faccia è aggiungere 1 al byte meno significativo, che so che è il 4 ° byte? Cioè, voglio prendere la stringa \ n \ r & amp; \ 0
e finire con la stringa \ n \ r & amp; \ 1
. Qual è il modo più semplice per farlo?
Esiste un modo per farlo senza dover decomprimere e reimballare la variabile?
Soluzione
Quello che sta succedendo è che si crea una stringa di byte con $ ip & amp; $ netmask
, quindi si prova a trattarla come un numero. Questo non funzionerà, come tale. Quello che devi alimentare in inet_ntoa
è.
pack("N", unpack("N", $ip&$netmask) + 1)
Non penso che ci sia un modo più semplice per farlo.
Altri suggerimenti
Numeri e stringhe confuse. Forse il seguente codice sarà di aiuto:
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";
Quali output:
192.168.250.1