2010-07-07 7 views
2

J'ai eu ce problème dans Perl pendant quelques jours maintenant, et après avoir parcouru d'innombrables pages de manuel, perldocs et googler trop de termes de recherche, j'espère que quelqu'un ici pourra m'aider. On me donne deux chaînes qui représentent des valeurs hexadécimales, c'est-à-dire "FFFF", et non le nombre hexadécimal Perl 0xFFFF. Étant donné deux de ces chaînes, je souhaite les convertir en forme binaire, effectuer un AND bit à bit des deux, puis prendre la sortie de cela et examiner chaque bit de LSB à MSB.Perl pack/unpack/shift

J'ai deux problèmes en ce moment; convertir la chaîne hexadécimale en un nombre hexadécimal, et en déplaçant le résultat du AND bit à bit.

Pour convertir la chaîne hexagonale en nombre hexadécimal, j'ai essayé les approches suivantes qui ne semblent pas fonctionner quand je les imprimer à examiner:

$a = unpack("H*", pack("N*", $a)); 

$a = sprintf("%H", $a); 

l'aide d'une « impression » d'examiner chacun de ceux-ci n'affiche pas une valeur correcte, ni utilise 'sprintf' non plus ...

Le deuxième problème que j'ai se produit après que j'exécute un AND binaire, et je veux examiner chaque bit en décalant à droite par 1. Pour éviter le problème précédent, j'ai utilisé des nombres hexadécimaux Perl réels au lieu des chaînes hexadécimales (0xffff au lieu de "ffff"). Si je tente d'effectuer un déplacement vers la droite comme suit:

#Convert from hex number to binary number 

$a = sprintf("%B", $a); 
$b = sprintf("%B", $b); 

$temp = pack("B*", $a) & pack("B*", $b); 
$output = unpack("B*", $temp); 

A ce tout moment semble bien, et en utilisant un « print » Je peux voir que les valeurs de l'opération ET regarder à droite, mais lorsque je tente de changer comme suit:

$output = pack("B*", $output); 
$output = $output >> 1; 
$output = unpack("B*", $output); 

La valeur résultante que j'obtiens est sous forme binaire mais pas correcte.

Quelle est la bonne façon d'effectuer ce type d'opération?

Répondre

9

Il n'y a pas de "numéro hexadécimal". Un nombre est un nombre, une représentation hexadécimale d'un nombre est juste que - une représentation .

Juste turn it into a number et utilisez bitwise et.

my $num = (hex $a) & (hex $b); 
print ($num & 1, "\n") while ($num >>= 1) 
+1

Voulez-vous dire 'while ($ num >> = 1)'? – mob

+0

@mobrule: Probablement, ouais. Merci. –

+0

Ah merci, c'est beaucoup plus clair maintenant – materiamage