2012-05-12 5 views
0

При работе с распаковкой я надеялся, что b3 вернет битовую строку длиной 3 бита.Разбиение битовых строк в Perl

код, который я надеялся писать (для разбора пакета данных WebSocket) был:

my($FIN,$RSV1, $RSV2, $RSV3, $opcode, $MASK, $payload_length) = unpack('b1b1b1b1b4b1b7',substr($read_buffer,0,2)); 

Я заметил, что это не то, что я надеялся.

Если я использовал b16 вместо шаблона выше, я получаю все 2 байта, загруженные в первую переменную, как «1000000101100001».

Это здорово, и у меня нет проблем с этим.

Я могу использовать то, что у меня есть, сделав кучу подстрок, но есть ли лучший способ сделать это? Я надеялся, что будет способ обработать эту битовую строку с шаблоном, подобным тому, который я попытался сделать. Какая-то функция, где я могу передать спецификацию пакета с правой стороны и список переменных слева?

Редактировать: Я не хочу делать это с регулярным выражением, так как он будет в очень узкой петле, которая будет происходить много.

Edit2: В идеале было бы неплохо указать, какую битовую строку следует оценивать как (логическое, целое и т. Д.).

+0

Что находится в '$ read_buffer'? –

+0

@ SinanÜnür $ read_buffer - это двоичные данные для пакета – GoldenNewby

ответ

1

Если я правильно понял, ваша цель состоит в том, чтобы разбить 2-байтовый ввод на 7 новых переменных. Для этой цели вы можете использовать побитовые операции. Это пример того, как получить значение $opcode:

my $b4 = $read_buffer & 0x0f00; # your mask to filter 9-12 bits 
$opcode = $b4 >> 8;    # rshift your bits 

Вы можете сделать то же манипуляции (возможно в одном операторе, если вы хотите) для всех переменных, и он должен выполнить в разумном хорошей скорости.

+0

Я обычно сбрасываю сначала (например, 'my $ opcode = ($ read_buffer >> 8) & 0xF;'), потому что обычно понятно, сколько битов извлекается. – ikegami

Смежные вопросы