Conversion de nombres hexadécimaux dans les chaînes de nombres négatifs, en Perl
Question
J'ai un tas de chiffres représentés sous forme de chaînes hexadécimaux dans les fichiers journaux qui sont en cours d'analyse par un script Perl, et je suis relativement peu d'expérience avec Perl.
Certains de ces numéros sont effectivement signé des nombres négatifs, à savoir 0xFFFE == -2
lorsqu'il est représenté comme un nombre entier signé 16 bits.
Quelqu'un peut-il s'il vous plaît me dire la manière canonique d'obtenir la représentation signée de ce numéro de la FFFE
chaîne en Perl, ou me diriger autrement à un tutoriel ou une autre ressource?
La solution
Vous pouvez utiliser l'hexagone () fonction pour convertir hexadécimal en décimal, mais il interprète l'entrée en tant que valeur non signée. Pour compenser cela, emballer la valeur décimale comme une quantité non signée et décompressez comme signé un:
my $num = unpack('s', pack('S', hex('FFFE')));
Le « s » et des modèles « S » sont signés et non signés pour des quantités de 16 bits, respectivement. Consultez la documentation de la fonction pack
pour d'autres modèles et informations d'utilisation.
Autres conseils
print unpack('s>', pack('H4', 'FFFE'));
-2