在Perl中解析位字符串

时间:2012-05-12 18:43:01

标签: perl binary

使用unpack时,我曾希望b3会返回一个3位长的字符串。

我希望编写的代码(用于解析websocket数据包)是:

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

我注意到这不符合我的期望。

如果我使用b16而不是上面的模板,我将整个2个字节加载到第一个变量“1000000101100001”。

那很好,我对此没有任何问题。

到目前为止,我可以通过做一堆子串来使用我已经得到的东西,但是有更好的方法吗?我希望有一种方法可以使用类似于我试图制作的模板处理该位串。某种功能,我可以在右侧传递数据包的规范,并在左侧传递变量列表?

编辑:我不想用正则表达式执行此操作,因为它将在一个非常紧凑的循环中发生很多。

Edit2:理想情况下,能够指定应该将位字符串评估为(布尔值,整数等)会很好。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你的目标是将2字节输入分成7个新变量。 为此,您可以使用按位运算。这是如何获取$opcode值的示例:

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

您可以对所有变量执行相同的操作(可能在单个语句中,如果需要),它应该以合理的良好速度执行。