2010-01-21 15 views
11

Ich habe eine Reihe von Zahlen als hexadezimale Zeichenfolgen in Protokolldateien, die von einem Perl-Skript analysiert werden, und ich bin relativ unerfahren mit Perl.Konvertieren von hexadezimalen Zahlen in Strings in negative Zahlen, in Perl

Einige dieser Nummern sind tatsächlich mit negativen Zahlen versehen, d. H. , wenn sie als 16-Bit-Ganzzahl mit Vorzeichen dargestellt sind.

Kann mir bitte jemand den kanonischen Weg sagen, die vorzeichenbehaftete Darstellung dieser Nummer aus der Zeichenkette FFFE in Perl zu erhalten, oder mich anderweitig auf ein Tutorial oder eine andere Ressource verweisen?

+5

Nur FWIW, zumindest im 2er-Komplement, FFFE ist -2 - FFFF ist -1. –

+0

Ähm, hoppla. Du hast absolut recht, ich habe nicht nachgedacht. –

Antwort

20

Sie können die Funktion hex() verwenden, um von hexadezimal in dezimal zu konvertieren, aber sie interpretiert die Eingabe als vorzeichenlosen Wert. Um das zu kompensieren, packen den Dezimalwert als unsigned Menge und entpacken als schriebenes:

my $num = unpack('s', pack('S', hex('FFFE'))); 

Die ‚s‘ und ‚S‘ templates sind für signierte und unsignierte 16-Bit-Mengen sind. Informationen zu anderen Vorlagen und Verwendungsinformationen finden Sie in der Dokumentation zur pack-Funktion.

+4

Ich wünschte, mehr Leute wüssten über die Packung. Es ist so ein wunderbares Werkzeug. :) –

+0

Mindestens ein mehr tut jetzt. Das war genau das, was ich brauchte, vielen Dank Michael. –

1
print unpack('s>', pack('H4', 'FFFE')); 
-2 
Verwandte Themen