2010-07-07 9 views
2

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

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

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

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

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

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

Использование «Печать», чтобы изучить каждый из них не показывает правильное значение, а также не использует «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); 

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

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

Получающееся значение, которое я получаю, имеет двоичную форму, но не корректно.

Каков правильный способ выполнения такого рода операций?

ответ

9

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

Только turn it into a number и используйте поразрядные и.

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

Возможно, вы имели в виду 'while ($ num >> = 1)'? – mob

+0

@mobrule: Наверное, да. Благодарю. –

+0

Ах спасибо, теперь намного понятнее – materiamage