Convertendo números hexadecimais em strings em números negativos, em Perl
Pergunta
Eu tenho vários números representados como strings hexadecimais em arquivos de log que estão sendo analisados por um script Perl e sou relativamente inexperiente com Perl.
Alguns desses números são, na verdade, números negativos com sinal, ou seja, 0xFFFE == -2
quando representado como um número inteiro com sinal de 16 bits.
Alguém pode me dizer a maneira canônica de obter a representação assinada deste número da string FFFE
em Perl ou me indicar um tutorial ou outro recurso?
Solução
Você pode usar o hexadecimal() função para converter de hexadecimal para decimal, mas interpreta a entrada como um valor sem sinal.Para compensar isso, empacote o valor decimal como uma quantidade não assinada e descompacte-o como uma quantidade assinada:
my $num = unpack('s', pack('S', hex('FFFE')));
Os modelos 's' e 'S' são para quantidades de 16 bits com e sem sinal, respectivamente.Consulte a documentação do pack
função para outros modelos e informações de uso.
Outras dicas
print unpack('s>', pack('H4', 'FFFE'));
-2