Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中解析位字符串_Perl_Binary - Fatal编程技术网

在Perl中解析位字符串

在Perl中解析位字符串,perl,binary,Perl,Binary,在使用unpack时,我希望b3将返回一个长度为3位的位字符串 我希望编写的代码(用于解析websocket数据包)是: 我注意到这并没有达到我的期望 如果我使用b16而不是上面的模板,我会将整个2个字节作为“10000001100001”加载到第一个变量中 那太好了,我对此没有异议 我可以利用到目前为止所得到的,通过做一系列的子字符串,但是有更好的方法吗?我希望有一种方法可以使用类似于我试图制作的模板来处理该位字符串。某种函数,我可以在右边传递数据包的规范,在左边传递变量列表 编辑:我不想用正

在使用unpack时,我希望b3将返回一个长度为3位的位字符串

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

我注意到这并没有达到我的期望

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

那太好了,我对此没有异议

我可以利用到目前为止所得到的,通过做一系列的子字符串,但是有更好的方法吗?我希望有一种方法可以使用类似于我试图制作的模板来处理该位字符串。某种函数,我可以在右边传递数据包的规范,在左边传递变量列表

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


Edit2:理想情况下,最好能够指定位字符串的计算结果(布尔值、整数等)。

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

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

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

@SinanÜnür$read_buffer是数据包的二进制数据,我通常先移位(例如,
my$opcode=($read_buffer>>8)&0xF;
)因为它通常更清楚地知道提取了多少位。
my $b4 = $read_buffer & 0x0f00;  # your mask to filter 9-12 bits
$opcode = $b4 >> 8;              # rshift your bits