Conversión de números hexadecimales en cadenas en números negativos, en Perl
Pregunta
Tengo un montón de números representados como cadenas hexadecimales en los archivos de registro que se está analizando por un script Perl, y estoy relativamente poca experiencia con Perl.
Algunos de estos números son en realidad firmaron números negativos, es decir 0xFFFE == -2
cuando se representa como un entero con signo de 16 bits.
Puede alguien por favor dígame la forma canónica de conseguir la representación firmada de este número de la cadena FFFE
en Perl, o de lo contrario me punto a un tutorial o algún otro recurso?
Solución
Puede utilizar el hexagonal () función para convertir de hexadecimal a decimal, pero interpreta la entrada como un valor sin signo. Para compensar esto, el paquete del valor decimal como una cantidad sin signo y descomprimirlo como uno firmado:
my $num = unpack('s', pack('S', hex('FFFE')));
La 's' y 'S' plantillas son para cantidades de 16 bits con y sin signo, respectivamente. Consulte la documentación de la función pack
para otras plantillas y la información de uso.
Otros consejos
print unpack('s>', pack('H4', 'FFFE'));
-2