2016-02-11 5 views
1

donc je sais qu'il ya des bibliothèques qui peuvent le faire pour moi mais je veux apprendre pack/unpack.Comprendre pack/unpack perl

mon but est d'avoir un utilisateur entrée une adresse IP/masque de sous-réseau, puis vérifiez que c'est valide. D'une certaine façon, je pensais le faire était "sprintf" et obtenir une valeur binaire de 192.168.1.1 disons. c'est une bonne solution, mais alors je dois ajouter la quantité requise de 0 t faire '8 bits'

cela semble beaucoup de travail inutile lorsque pack peut mettre les choses en format binaire. J'ai utilisé le modèle N j'ai trouvé http://perldoc.perl.org/functions/pack.html mon premier objectif était d'obtenir une adresse IP, le convertir en binaire, puis le convertir en retour.

$ip = "192.168.1.1";  
$bi = pack ("N*", $ip);  
print unpack("N*",$bi),"\n"; 

et la sortie je suis arrivé était 192 si évidemment je ne comprends pas ce qui se passe ici.

Que se passe-t-il exactement ici?

+1

Toujours utiliser 'use strict; utiliser les avertissements qw (tous); ("' Argument "192.168.1.1" n'est pas numérique dans le pack' ") – ikegami

Répondre

4

pack ("N*", $ip) prend un nombre entier de $ ip et le place dans l'ordre des octets du réseau.

Ce que vous voulez est d'empaqueter les 4 octets décimaux de l'adresse IP comme binaire. Pas besoin de jouer avec l'endianness car la chaîne d'adresse IP est déjà en big endian (l'octet le plus haut est déjà au début de la chaîne).

J'ai aussi changé le * à un 4, les adresses IP sont toujours 4 octets de long:

$ip = "192.168.1.1";  
$bi = pack "C4", split('\.', $ip); 
print join('.', unpack("C4",$bi)), "\n";