2010-01-21 16 views
11

Ho un mucchio di numeri rappresentati come stringhe esadecimali nei file di log che vengono analizzati da uno script Perl, e sono relativamente inesperto con Perl.Conversione di numeri esadecimali in stringhe su numeri negativi, in Perl

Alcuni di questi numeri sono in realtà numeri negativi con segno, ovvero 0xFFFE == -2 quando rappresentati come numero intero con segno a 16 bit.

Qualcuno può dirmi il modo canonico di ottenere la rappresentazione firmata di questo numero dalla stringa FFFE in Perl, o altrimenti indicarmi un tutorial o un'altra risorsa?

+5

Solo FWIW, almeno in complemento a 2, FFFE è -2 - FFFF è -1. –

+0

Err, whoops. Hai assolutamente ragione, non stavo pensando. –

risposta

20

È possibile utilizzare la funzione hex() per convertire da esadecimale a decimale, ma interpreta l'input come un valore senza segno. Per compensare questo, imballare il valore decimale come una quantità senza segno e decomprimerlo come firma uno:

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

's' The e modelli di 'S' sono per quantità a 16 bit con e senza segno, rispettivamente. Consultare la documentazione per la funzione pack per altri modelli e informazioni sull'utilizzo.

+4

Vorrei che più persone sapessero del branco. È uno strumento meraviglioso. :) –

+0

Almeno un altro ora. Questo era esattamente ciò di cui avevo bisogno, grazie mille Michael. –

1
print unpack('s>', pack('H4', 'FFFE')); 
-2 
Problemi correlati