Вы совершаете ошибку unpack
, вводя $ data в $x
перед его использованием при вызове vec
. vec
ожидает строку, поэтому, если вы укажете число, оно будет преобразовано в строку перед использованием. Вот твой код
my @hexData1 = qw(50 65);
my $data= pack ('C*', @hexData1);
Формат C
pack
использует каждое значение в списке источников в качестве кода символа. Это то же самое, что вызывать chr
для каждого значения и объединять их. К сожалению, ваши значения выглядят как десятичные, поэтому вы получаете chr(50).chr(65)
или "2A"
. Так как ваши значения имеют порядок байтов, то вы хотите chr(0x65).chr(0x50)
или "\x65\x50"
, поэтому вы должны написать
my $data= pack ('(H2)*', reverse @hexData1);
, который переворачивает список данных (чтобы учесть, что он имеет младший порядок) и упаковывает его, как если бы это был список двузначных шестнадцатеричных строк (что, к счастью, так и есть).
Теперь вы сделали достаточно. Как я уже сказал, vec
ожидает строку, поэтому вы можете написать
print join ' ', map vec($data, $_, 1), 0 .. 15;
print "\n";
и он покажет вам биты, которые вы ожидаете. Чтобы извлечь 3-й бит справа (при условии, что вы имеете в виду бит 13, где последний бит равен 15), вы хотите
print vec $data, 13, 1;