使用unpack时,我曾希望b3会返回一个3位长的字符串。
我希望编写的代码(用于解析websocket数据包)是:
my($FIN,$RSV1, $RSV2, $RSV3, $opcode, $MASK, $payload_length) = unpack('b1b1b1b1b4b1b7',substr($read_buffer,0,2));
我注意到这不符合我的期望。
如果我使用b16而不是上面的模板,我将整个2个字节加载到第一个变量“1000000101100001”。
那很好,我对此没有任何问题。
到目前为止,我可以通过做一堆子串来使用我已经得到的东西,但是有更好的方法吗?我希望有一种方法可以使用类似于我试图制作的模板处理该位串。某种功能,我可以在右侧传递数据包的规范,并在左侧传递变量列表?
编辑:我不想用正则表达式执行此操作,因为它将在一个非常紧凑的循环中发生很多。
Edit2:理想情况下,能够指定应该将位字符串评估为(布尔值,整数等)会很好。
答案 0 :(得分:1)
如果我理解正确,你的目标是将2字节输入分成7个新变量。
为此,您可以使用按位运算。这是如何获取$opcode
值的示例:
my $b4 = $read_buffer & 0x0f00; # your mask to filter 9-12 bits
$opcode = $b4 >> 8; # rshift your bits
您可以对所有变量执行相同的操作(可能在单个语句中,如果需要),它应该以合理的良好速度执行。