Преобразование шестнадцатеричных чисел в строки в отрицательные числа, в Perl

У меня есть куча чисел, представленных в виде шестнадцатеричных строк в файлах журналов, которые обрабатываются Perl script, и я относительно неопытен с Perl.

Некоторые из этих чисел представляют собой фактически подписанные отрицательные числа, т.е. 0xFFFE == -2, если они представлены как 16-разрядное целое число со знаком.

Может кто-нибудь, скажите мне канонический способ получить подписанное представление этого числа из строки FFFE в Perl или иначе указать мне на учебник или другой ресурс?

Ответ 1

Вы можете использовать функцию hex() для преобразования из шестнадцатеричного в десятичный, но он интерпретирует ввод как значение без знака. Чтобы компенсировать это, упакуйте десятичное значение как неподписанное количество и распакуйте его как подписанное:

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

Шаблоны 's' и 'S' предназначены для 16-разрядных величин с подписью и без знака, соответственно. См. Документацию для функции pack для других шаблонов и информации об использовании.

Ответ 2

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