2008-10-21 9 views
7

J'ai une variable qui contient une adresse IPv4 réseau de 4 octets (créée à l'aide de pack et de la représentation entière). J'ai une autre variable, aussi un réseau-ordre de 4 octets, sous-réseau. J'essaie de les ajouter ensemble et d'en ajouter un pour obtenir la première adresse IP dans le sous-réseau. Pour obtenir la représentation ASCII, je peux faire inet_ntoa($ip&$netmask) pour obtenir l'adresse de base, mais c'est une erreur de faire inet_ntoa((($ip&$netmask)+1); Je reçois un message comme:Quelle est la manière la plus simple d'ajouter un à une chaîne binaire en Perl?

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

Alors ce qui se passe, le meilleur que je peux dire, est-il regarde les 4 octets, et de voir que les 4 octets ne représentent pas une chaîne numérique, puis en refusant de ajouter 1.

Une autre façon de le mettre: Ce que je veux faire est d'ajouter 1 à l'octet le moins significatif, que je sais est le 4ème octet? Autrement dit, je veux prendre la chaîne \n\r&\0 et finir avec la chaîne \n\r&\1. Quelle est la manière la plus simple de le faire?

Y a-t-il un moyen de le faire sans avoir à déballer et réemballer la variable?

Répondre

13

Qu'est-ce qui se passe est que vous faites une chaîne d'octets avec $ip&$netmask, puis essayez de le traiter comme un nombre. Cela ne va pas fonctionner, en tant que tel. Ce que vous devez alimenter à inet_ntoa est.

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

Je ne pense pas qu'il existe une façon plus simple de le faire.

+0

Je pense que vous avez raison. Essayait juste de voir s'il y avait un moyen plus simple, mais hélas, il n'y a peut-être pas. –

8

Confondre les entiers et les chaînes. Peut-être 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"; 

qui délivre en sortie:

192.168.250.1 
Questions connexes