Konvertieren von hexadezimalen Zahlen in Strings zu negativen Zahlen in Perl
Frage
Ich habe eine Reihe von Zahlen als hexadezimale Zeichenkette in Protokolldateien dargestellt, die von einem Perl-Skript analysiert werden, und ich bin relativ unerfahren mit Perl.
Einige dieser Zahlen werden tatsächlich negativen Zahlen mit Vorzeichen, d.h. 0xFFFE == -2
wenn sie als 16-Bit-Ganzzahl mit Vorzeichen repräsentiert.
Kann jemand bitte sagen Sie mir die kanonische Weise die signierte Darstellung dieser Zahl aus dem String FFFE
in Perl zu bekommen, oder auf andere Weise zeigen Sie mir ein Tutorial oder eine andere Ressource?
Lösung
Sie können mit der hex () Funktion convert von hexadezimal dezimal, aber er interpretiert die Eingabe als ein Wert ohne Vorzeichen. Um das zu kompensieren, packen den Dezimalwert als unsigned Menge und entpacken Sie es als eine unterzeichneten:
my $num = unpack('s', pack('S', hex('FFFE')));
Die ‚s‘ und ‚S‘ Vorlagen sind für signierte und unsignierte 16-Bit-Mengen sind. Lesen Sie die Dokumentation für die pack
Funktion für andere Vorlagen und Anwendungsinformationen.
Andere Tipps
print unpack('s>', pack('H4', 'FFFE'));
-2