Perl pack / unpack / shift - PullRequest
       44

Perl pack / unpack / shift

2 голосов
/ 08 июля 2010

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

Мне даны две строки, которые представляют шестнадцатеричные значения, то есть "FFFF", а не шестнадцатеричное число Perl 0xFFFF. Учитывая две из этих строк, я хочу преобразовать их в двоичную форму, выполнить побитовое И из двух, затем взять выходные данные этого и исследовать каждый бит от LSB до MSB.

У меня сейчас две проблемы; преобразование шестнадцатеричной строки в шестнадцатеричное число и сдвиг результат побитового И. *. 1005 *

Для преобразования шестнадцатеричной строки в шестнадцатеричное число я попробовал следующие подходы, которые, кажется, не работают, когда я распечатываю их для проверки:

$a = unpack("H*", pack("N*", $a));

$a = sprintf("%H", $a);

Использование «print» для проверки каждого из них не показывает правильное значение, равно как и использование «sprintf» ...

Вторая проблема у меня возникает после выполнения побитового И, и я хочу проверить каждый бит, сдвигая вправо на 1. Чтобы избежать предыдущей проблемы, я использовал реальные шестнадцатеричные числа Perl вместо шестнадцатеричных строк (0xffff вместо " FFFF "). Если я попытаюсь выполнить сдвиг вправо следующим образом:

#Convert from hex number to binary number

$a = sprintf("%B", $a);
$b = sprintf("%B", $b);

$temp = pack("B*", $a) & pack("B*", $b);
$output = unpack("B*", $temp);

В этот момент все выглядит хорошо, и, используя «print», я вижу, что значения операции AND выглядят правильно, но когда я пытаюсь смещаться следующим образом:

$output = pack("B*", $output);
$output = $output >> 1;
$output = unpack("B*", $output);

Полученное значение получено в двоичной форме, но не правильно.

Как правильно выполнить эту операцию?

1 Ответ

9 голосов
/ 08 июля 2010

Нет такой вещи как "шестнадцатеричное число". Число - это число, шестнадцатеричное представление числа - это просто: представление .

Просто превратить его в число и использовать поразрядно и.

my $num = (hex $a) & (hex $b);
print ($num & 1, "\n") while ($num >>= 1)
...