Conversione numeri esadecimali nelle stringhe di numeri negativi, in Perl
Domanda
Ho un po 'di numeri rappresentati come stringhe esadecimali nei file di log che vengono analizzati da uno script Perl, e sono relativamente inesperti con Perl.
Alcuni di questi numeri sono effettivamente firmati numeri negativi, cioè quando 0xFFFE == -2
rappresentato come numero intero di 16 bit.
Qualcuno può dirmi il modo canonico di ottenere la rappresentazione firmato di questo numero dal FFFE
stringhe in Perl, o in altro punto me un tutorial o altre risorse?
Soluzione
È possibile utilizzare l'esagono () funzione 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')));
La 's' e modelli di 'S' sono per quantità a 16 bit con e senza segno, rispettivamente. per la pack
funzione per altri modelli e le informazioni sull'uso, consultare la documentazione.
Altri suggerimenti
print unpack('s>', pack('H4', 'FFFE'));
-2