Quel est le moyen le plus simple d’ajouter un à une chaîne binaire en Perl?
Question
J'ai une variable qui contient une adresse IPv4 d'ordre réseau sur 4 octets (elle a été créée à l'aide de pack et de la représentation sous forme d'entier). J'ai une autre variable, également un sous-réseau d'ordre du réseau de 4 octets. J'essaie de les additionner et d'en ajouter une pour obtenir la première adresse IP du sous-réseau.
Pour obtenir la représentation ASCII, je peux utiliser inet_ntoa ($ ip & $ netmask)
pour obtenir l'adresse de base, mais c'est une erreur masque de réseau) +1) ; je reçois un message du type:
Argument "\n\r&\0" isn't numeric in addition (+) at test.pm line 95.
Donc, ce qui se passe, le mieux que je puisse dire, est de regarder les 4 octets et de voir que les 4 octets ne représentent pas une chaîne numérique, puis de refuser d'ajouter 1.
Une autre façon de le dire: ce que je veux, c’est d’ajouter 1 à l’octet le moins significatif, qui est le 4e octet? C’est-à-dire que je veux prendre la chaîne \ n \ r & amp; \ 0
et me retrouver avec la chaîne \ n \ r & amp; \ 1
. Quel est le moyen le plus simple de faire ça?
Y a-t-il un moyen de faire cela sans avoir à décompresser et à remballer la variable?
La solution
Ce qui se passe, c’est que vous créez une chaîne d’octets avec $ ip & $ netmask
, puis que vous essayez de la traiter comme un nombre. Cela ne va pas fonctionner en tant que tel. Ce que vous devez alimenter vers inet_ntoa
est.
pack("N", unpack("N", $ip&$netmask) + 1)
Je ne pense pas qu'il existe un moyen plus simple de le faire.
Autres conseils
Entiers et chaînes confus. Peut-être que le code suivant vous aidera:
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";
Quelles sorties:
192.168.250.1