Quel est le moyen le plus simple d’ajouter un à une chaîne binaire en Perl?

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

  •  03-07-2019
  •  | 
  •  

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?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top