0

在使用 unpack 时,我曾希望 b3 会返回一个位串,长度为 3 位。

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

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

我注意到这并没有达到我的预期。

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

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

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

编辑:我不想用正则表达式来做这件事,因为它会处于一个非常紧密的循环中,会经常发生。

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

4

1 回答 1

1

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

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

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

于 2012-05-12T19:35:06.693 回答